|

2024-11-28

データ関連

え!BigQuery UtilsのUDFってもう全世界公開されていてリージョン気にせず使えるってほんと?

BigQueryGoogle Cloud

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に聞いてみました。 image

(すみません、本当に雑に聞いているスクショそのままです。 打つってなんだよという感じですが)

 

え!と声が出ました。

情報源のページ 「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から最大の値を引っ張る)はというと、

cw_array_max.sqlxのソースコード によると

( 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}}' ) )

を実行すると

  image

 

たしかに無事に実行されました!

 

先ほどの cw_array_max もこの通りです。

  image

 

これで手動デプロイなく BigQuery UtilsのUDF群をどのリージョンでも便利に使えますね。

※ セキュリティの観点等からVPC SCで境界を切っている場合は、 bqutil のプロジェクトとの疎通が必要であることに注意が必要です。

 

まとめ

今回はBigQuery Utilsがいつのまにか全世界公開されていた、という話でした。

これは本当に寝耳に水でした。。 Google Cloud さんのブログって結構重要な情報があったりしますよね。

メンテナンス対象が一つ減って気分的にもとてもいいです。既存のクエリ群についても書き換えていこうと思います。

 

BigQuery Utils を多用しすぎるとクエリの汎用性は下がってしまう(環境依存性が上がってしまう)ので、そのあたりには注意が必要かとは思いますが、使わない手はないくらい便利なものではあるので、ぜひうまく活用していきたいところです。

 


この記事の著者

プロフィール画像

伴 拓也

朝日放送グループホールディングス株式会社 DX・メディアデザイン局 デジタル・メディアチーム

アプリケーションからインフラ、ネットワーク、データエンジニアリングまで幅広い守備範囲が売り。最近はデータ基盤の構築まわりに力を入れて取り組む。 主な実績として、M-1グランプリ敗者復活戦投票システムのマルチクラウド化等。