BigQuery Remote Functions
リモート関数の操作  |  BigQuery  |  Google Cloud
割り当てと上限  |  BigQuery  |  Google Cloud
リモート関数の戻り値は変動すると常に想定されるため、リモート関数を呼び出したクエリの結果はキャッシュに保存されません。
BigQuery からの再試行を最小限に抑えるには、失敗したレスポンスに 408、429、500、503、504 以外の HTTP レスポンス コードを使用し、関数のコード内ですべての例外をキャッチします。それ以外の場合、HTTP サービス フレームワークは、キャッチされない例外に対して自動的に 500 を返します。
やってみる
適当な Cloud Functions を作る
RemoteFunctions のちょうどいい struct ないのかな
ぱっとない
参考 bq_cloud_function_golang/remote.go at main · salrashid123/bq_cloud_function_golang · GitHub
type RemoteFunctionOptions ¶ - bigquery package - cloud.google.com/go/bigquery - Go Packages
ほう
何個 Calls が来るかよくわからんな
max_batching_rows
一旦指定しないとどうなるのか見てみる
pokutuna/cloud-functions-playground@master - bq-remote-fetch/function.go
CREATE FUNCTION ステートメント - Google 標準 SQL のデータ定義言語(DDL)ステートメント  |  BigQuery  |  Google Cloud
code:ddl.sql
CREATE FUNCTION pokutuna-playground.gomibako.REMOTE_LEN(s STRING) RETURNS INT64
REMOTE WITH CONNECTION pokutuna-playground.asia-northeast1.remote-function-example
OPTIONS (
endpoint='https://asia-northeast1-pokutuna-playground.cloudfunctions.net/bq-remote-functions'
)
480 行ぐらいなら1回の function 実行で来る
100000行ぐらい渡してみるか
code:call_many.sql
SELECT
*,
pokutuna-playground.gomibako.REMOTE_LEN(CAST(num AS STRING)) AS len
FROM UNNEST(GENERATE_ARRAY(1, 100000)) AS num
値はちゃんと入っていそうだけど Functions 側のログがおかしくなるな
fmt で log 書いてるのが悪かろうと log でもだめだなあ
入力まるごとでかい payload で書いているからおかしいのかも
10万行入力して4回ぐらいのリクエストに分かれてやってくる
nil 返したら NULL になる?
なる
関数で並列数制限して外部 API を叩いてみる
まあできた
semaphore で並列数3ぐらい & Cloud Functions の max-instance 1 にする
スケールさせるにはデカくすればいいのだが
max_batching_rows はいいかなあ
BQ --> Functions --*--> API
制御したいのはこっちなので
max_batching_rows はなしで、逆に calls がでかすぎるときにエラー返すようにすればちょっと安全か?
#BigQuery #GoogleCloud