🥓
[BigQuery]シェルスクリプトで特定の文字列を含むテーブルを一括削除する
シェルスクリプトで特定の文字列を含むテーブルを一括削除するサンプルコード(覚書き)
一括としてますが、内部で、bqコマンドを使って順に削除していく形となっています
前提条件
- Cloud SDK がインストール済であること
→ まだの場合は以下を参考にインストールすること
Cloud SDK のインストール | Google Cloud - 対象プロジェクトのユーザーアカウントもしくはサービスアカウントが承認済であること
→ まだの場合は以下を参考に承認しておくこと
Cloud SDK ツールの承認 | Google Cloud
コード
特定の文字列を含む(部分一致)テーブル削除のコードは以下の通り。
今回は、-dummy, -test-を含むテーブルを削除する、という内容になっています
本処理にて、変数tablesに削除したいテーブルに含まれる文字列を指定し、順に関数dropTablesを呼び出して削除させています
前方一致や後方一致が良い場合は、dropTables内の1行目の記述「"%'$1'%"」を「"%'$1'"」や「"$1'%"」に変更してください
また、「dataset_id」は接続先プロジェクトの本処理を実行させたいデータセット名(ID)に書き換えてください。
dropTables.sh
#!bin/bash
#
# 特定の文字列を含むテーブルを削除する
#
#
# テーブルを削除する
# S1 テーブル名(部分一致)
#
function dropTables(){
sql='select table_id from `dataset_id.__TABLES__` where table_id like "%'$1'%"'
bqResultBefore=`bq query --nouse_legacy_sql $sql`
# テーブル一覧を配列に入れる(bq query実行結果からsedで不要なパーツを切り取りの後)
tables=(`echo $bqResultBefore | sed -e "s/\+-*\+//g" -e "s/ | //g" -e "s/table_id//g" -e "s/|//g"`)
echo "$1テーブル群の削除を開始します"
for table in ${tables[@]}
do
bq rm -f dataset_id.$table
echo "$tableを削除しました"
done
echo "$1テーブル群の削除を終了します"
bqResultAfter=`bq query --nouse_legacy_sql $sql`
# クエリ結果の有無で成否を判定
if [ -z "$bqResultAfter" ]; then
return 0
else
return 1
fi
}
#
# エラーメールの送信
# 送信元: hoge@example.com
# 送信先: fuga@example.com
#
# $1 エラーメッセージ
#
function sendErrorMail(){
HOSTNAME=$(hostname)
echo -e $1
echo -e $1 | mail -s "テーブル削除処理失敗@${HOSTNAME}" -r hoge@example.com fuga@example.com
}
# 以下、本処理
echo "テーブルの削除を開始します"
# 削除したいテーブルに含まれる文字列
tables=("-dummy-" "-test-")
errorTables=''
for table in ${tables[@]}
do
dropTables $table
if [ $? -eq 0 ]; then
echo "$tableの削除に成功しました"
else
echo "$tableの削除に失敗しました"
$errorTables+=$table','
fi
done
if [ -n "$errorTables" ]; then
message="${errorTables/%?/}の削除処理に失敗しました\n"
message+="詳細はログをご確認ください\n"
sendErrorMail $message
fi
echo "テーブルの削除を終了します"
終わりに
テスト用にテーブル作ったテーブルを一括削除したかったけれど、bq rm -dummy- みたいなワイルドカードを使った実行はできないようなので(逆にできたらキケンか・・)、シェルスクリプトにしてみました。
bqコマンドの実行結果そのままだと不要な文字列まで入ってしまうので、sedコマンドで不要な部分はカット!sedコマンド様様!!
Discussion