BigQueryでテーブルの存在判定をする方法について。
シンプルだが状況次第では有効なのでメモ。
方法としては下記である。データセット名、テーブル名はてきとう。
EXECUTE IMMEDIATE FORMAT(
"""
SELECT
DISTINCT 1
FROM
`project.dataset_%s.sharding_table_*`
WHERE
_TABLE_SUFFIX = '%d'
""",'a',20240101
) INTO Y;
IF Y> 0 THEN ~ END IF;
複数のデータセットがあり、それぞれシャーディングテーブルとなっている(例えば、GA4からBigQueryに日々エクスポートされるテーブルなど)場合でなおかつ、複数の日付に対して処理を行う場合などに有効。
例えば、下記の疑似コードのようなイメージ。
span = 今日 - 2024/1/1
for a in [データセットa, データセットb]:
FORMAT('''
for i in span:
aとiを使って、シャーディングテーブルを作成(or上書き)するクエリを記述
例えば、データセット%sのテーブル%dを使う
''', a, CAST(FROMAT_DATE(%Y%m%d, 今日-i日)AS INT64)
)
上述したテーブルの存在判定をしないと、SQL次第では下記の状況でエラーを吐く。
・データセットaとデータセットbいずれかについて、2024/1/1~今日の日付のシャーディングテーブルが存在しない場合
例えば、下記のような場合が考えられる。
・そもそもデータセットaが、20240301以降のシャーディングテーブルしかない場合
・何らかの原因で、20240101以降ほとんど存在しているが20230201のみ存在しない場合
個人的に、EXECUTE IMMEDIATE FORMAT の結果を INTO VARIABLE で変数に格納できることを知らなかったのでメモ。
公式ドキュメント:
https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#execute_immediate