BigQuery Utils からリージョンの壁はすでに消え去っていた
BigQuery Utils を更新したくなった
BigQuery Utils は便利なUDF(ユーザー定義関数)をまとめた 車輪の再発明防止用ツールです。
たとえば
SELECT bqutil.fn.json_extract_keys( '{"foo" : "cat", "bar": "dog", "hat": "rat"}' ) AS keys_array
とやれば
foo bar hat
と返ってきます。
GoogleCloudPlatform/bigquery-utils の GitHub リポジトリ にて管理されていて、日々更新されています。
便利なので、使うしかない!というものだったのですが、一つ課題がありました。
bqutil
プロジェクト内の USマルチリージョン に限定されていたことです。
なので、東京リージョンに展開されているデータセットと組み合わせては簡単に使用できず、手動でデプロイを行うほかありませんでした。
例に漏れず我々も手動デプロイしたものを使っていたのですが、リポジトリにあわせて逐次更新を行うほどの真面目さも持ち合わせていなかったので、当然リポジトリ側に比べて古いまま…なんてことになっていました。
ところが最近「この最近追加されたUDF使いたいんですよ、更新していいですか?」と言われて
はあ〜これ、たぶん簡単にいかないんだろうな〜、既存クエリとの互換性も一応確認しないとアカンしなあ… とか思いながら、どうにかなってないかなと一縷の望みをかけて何気なく、いつものように雑にChatGPTに聞いてみました。
(すみません、本当に雑に聞いているスクショそのままです。 打つってなんだよという感じですが)
え!と声が出ました。
情報源のページ 「BigQuery コミュニティの UDF を全世界に公開、誰もが簡単にデータ変換を行えるように」 を見ると、もうタイトルからわかる通りほんとに使えるやん、という話です。
今回はそのあたりの話をまとめていきます。
BigQuery Utilsについて
先ほどもあったとおり、BigQueryの便利なユーザー定義関数をまとめたライブラリです。
GoogleCloudPlatform/bigquery-utils の GitHub リポジトリ 内で sqlx
で管理されています。
特によく使うのは community
のUDF群で、
リポジトリの udfs/community
のディレクトリ の README は一読の価値があります。
ついでにいうと、使用するUDFの定義も一応目を通しておくのがオススメです。
単純に内部でどのように処理をしているのかを知ることが出来るのと、場合によっては使用をしないという判断をすることがあるかもしれないというのもあります。
たとえば、先ほどの json_extract_keys
(JSON文字列からキーを抜いてくるUDF)でいうと
json_extract_keys.sqlxのソースコード を確認すると、
try { return Object.keys(JSON.parse(input)); } catch { return null; }
と、JavaScriptで実装されていることがわかります。
一方で、 cw_array_max
(ARRAYから最大の値を引っ張る)はというと、
( SELECT MAX(x) FROM UNNEST(arr) AS x )
となっており、非常にシンプルです。
指針によってはクエリの汎用性を上げる等の観点から、
これくらいはUDFを使わずにそのまま書いた方が良いという判断をする組織もあるかもしれません。
実際の東京リージョンでの動作確認
本題の東京リージョンでの動作確認です。
US以外のリージョンでBigQuery Utilsを使用する場合は、
bqutil.<dataset>_<region>.<function>()
のように使用するとのことです。
なので、東京リージョンで動作を確認する場合は、 bqutil.fn_asia_northeast1.関数名
のように使用することになります。
というわけで早速…
SELECT * FROM UNNEST( bqutil.fn_asia_northeast1.json_extract_key_value_pairs( '{"foo" : "cat", "bar": [1,2,3], "hat": {"qux": true}}' ) )
を実行すると
たしかに無事に実行されました!
先ほどの cw_array_max
もこの通りです。
これで手動デプロイなく BigQuery UtilsのUDF群をどのリージョンでも便利に使えますね。
※ セキュリティの観点等からVPC SCで境界を切っている場合は、 bqutil
のプロジェクトとの疎通が必要であることに注意が必要です。
まとめ
今回はBigQuery Utilsがいつのまにか全世界公開されていた、という話でした。
これは本当に寝耳に水でした。。 Google Cloud さんのブログって結構重要な情報があったりしますよね。
メンテナンス対象が一つ減って気分的にもとてもいいです。既存のクエリ群についても書き換えていこうと思います。
BigQuery Utils を多用しすぎるとクエリの汎用性は下がってしまう(環境依存性が上がってしまう)ので、そのあたりには注意が必要かとは思いますが、使わない手はないくらい便利なものではあるので、ぜひうまく活用していきたいところです。