BigQueryの数千以上あるテーブルの中から、「○○というテーブル以外を全て削除したい」という処理を行おうとした際、それらしいオプションが見当たらなかったので少し遠回りをして削除しました。その際の処理を紹介します。
バックグラウンド
・残しておきたいテーブルは容量が大きく、
・1日あたりプロジェクトごとに読み込めるジョブの数は決まってい
・GUIだと日が暮れる
対応した手順は以下の3STEPです。 削除対象のテーブルをリストにし、一括で削除を走らせます。
1.BigQuery上の対象データセットから、全テーブルリストを取得する
2.削除するテーブル名だけを抽出
3.削除
実行内容
1 2 |
#データセット内の全てのテーブルリストを取得 $ bq ls -a <データセットID> > tables.txt |
bq lsコマンドではデフォルトで50件しかテーブル名を取得できないので、-aですべてを取得しています。
件数を指定したい場合は-n(
例)
bq ls -n 1000 <データセットID> > tables.txt
(bq ls –max_results=1000 <データセットID> > tables.txtでも可)
出力された結果は下記のようになっているので、不要な箇所(1,2行目)を取り除きます。
1 2 3 4 5 6 7 8 |
$ cat tables.txt tableId Type ------------- ------- table_091501 TABLE table_091502 TABLE table_091503 TABLE 除外したいテーブル TABLE … |
1 2 |
#全テーブル名から、1,2行目と除外したいテーブル名を除去 $ awk -F' ' '{print $1}' tables.txt | sed -e "1,2d" | grep -v <除外したいテーブル名> > rm_tables.txt |
削除したいテーブル名だけになりました。
1 2 3 4 5 |
$ cat rm_tables.txt table_091501 table_091502 table_091503 … |
1 2 |
#削除対象のテーブリスト(rm_tables.txt)をもとに、BigQuery内のテーブルを一気に削除します $ cat rm_tables.txt | xargs -n 1 bq --project_id <プロジェクトID> --dataset_id <データセットID> rm -f |
※今回はxargs -Pで並列処理を行うことはしていませんが、