概要
特定のデータセット配下に存在する複数テーブルに対して一括でクエリ実行をした際に使用したBigQueryスクリプトを紹介します。
__TABLES_SUMMARY__ テーブルとFOR INループを組み合わせることで、対象テーブルを動的に取得し、ストアドプロシージャの呼び出しやDROP TABLE等、お好きなクエリを楽に実行できます。
BigQueryスクリプト
ストアドプロシージャの一括呼び出し
-- 変数の宣言(BEGINの外)
DECLARE dataset_name STRING DEFAULT 'my_dataset';
-- メイン処理(BEGINの中)
BEGIN
FOR record IN (
SELECT table_id
FROM `my-project.my_dataset.__TABLES_SUMMARY__`
WHERE REGEXP_CONTAINS(table_id, r'^target_table_\d{8}$') --対象テーブル
ORDER BY table_id
)
DO
CALL `my-project.my_dataset.my_stored_procedure`(
dataset_name,
record.table_id
);
END FOR;
END;
テーブルの一括削除
DECLARE dataset_name STRING DEFAULT 'my_dataset';
BEGIN
FOR record IN (
SELECT table_id
FROM `my-project.my_dataset.__TABLES_SUMMARY__`
WHERE REGEXP_CONTAINS(table_id, r'^target_table_\d{8}$')
ORDER BY table_id
)
DO
EXECUTE IMMEDIATE FORMAT("""
DROP TABLE `my-project.%s.%s`
""", dataset_name, record.table_id);
END FOR;
END;
FOR INループを使用しているため1テーブルずつクエリ実行されるのでご注意下さい。
(並列実行されないので対象テーブルが100単位になると完了まで途方もない時間がかかります。)
以上です。
どなたかのお役に立てれば幸いです。
関連資料
- Procedural language | BigQuery - DECLARE、FOR IN、EXECUTE IMMEDIATEなどの構文
- FORMAT関数 - String functions | BigQuery - %s, %dなどのフォーマット指定子
- INFORMATION_SCHEMA の概要 | BigQuery - __TABLES_SUMMARY__などのメタテーブル