🐍

BigQuery API の Python client では DECLARE が使えない

2022/05/24に公開

結論

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 を使っているのが原因であることが疑われる。

https://stackoverflow.com/questions/58646725/cannot-set-destination-table-with-bigquery-python-api

では、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