🐍
BigQuery API の Python client では DECLARE が使えない
結論
google.api_core.exceptions.BadRequest: 400 configuration.query.createDisposition cannot be set for scripts
のようなエラーが出たとき
→ DECLARE
は使えないので代わりに UDF を使う
詳細
Airflow の BigQueryExecuteQueryOperator 経由で以下のような感じの SQL を実行させようとしていた(今回は Airflow を触っていて直面したが、おそらく BigQuery API でも起きると思われる)。BigQuery では DECLARE
+ SET
で変数を定義できるので、長ったらしいコードをそこかしこにコピペしなくて済む。
DECLARE first_of_month date;
SET first_of_month = DATE_TRUNC(DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 1 day), month);
SELECT
-- first_of_month を何度か使う処理
...;
この SQL で実行すると冒頭のようなエラーが出て失敗する。類似の事象は Stack Overflow にも挙がっており、DECLARE
を使っているのが原因であることが疑われる。
では、DECLARE
を使わずに似たようなことをしたい場合はどうするのかというと UDF を使えばよい。さっきの SQL は以下のように直せる。
CREATE TEMP FUNCTION first_of_month() AS (
DATE_TRUNC(DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 1 day), month)
);
SELECT
-- first_of_month を何度か使う処理。`first_of_month()` で呼び出して使う
...;
これで OK👌
Discussion