コンテンツに移動
データ分析

BigQuery リモート関数の開発を今すぐ始めましょう

2023年6月1日
https://storage.googleapis.com/gweb-cloudblog-publish/images/insights_2022.max-2500x2500.jpg
Google Cloud Japan Team

※この投稿は米国時間 2023 年 5 月 5 日に、Google Cloud blog に投稿されたものの抄訳です。

BigQuery は昨年、リモート関数を導入しました。ユーザーが Cloud Functions または Cloud Run で記述およびホストされている独自のカスタムコードを使用して、BigQuery SQL を拡張できる機能です。リモート関数を使用すると、カスタム SQL 関数を Node.js、Python、Go、Java、NET、Ruby、PHP などの言語で記述することができ、標準の管理モデルと権限モデルを活用しながら、組織ごとにパーソナライズされた BigQuery エクスペリエンスを実現できます。

私たちは、驚くほど多くのユースケースがリモート関数によって実現されるのを見てきました。お客様の成功に触発されて、実現可能な技術を、リモート関数開発を促進するためのいくつかの例、サンプルコード、動画による手順を含め、このブログで紹介することにしました。

SQL を使用した動的言語翻訳

たとえば、多国籍組織が共通の BigQuery テーブル内にさまざまな言語でお客様のフィードバックを保存しているとします。Translation API を使用すると、すべてのコンテンツを共通言語に翻訳でき、データの活用が容易になります。

この特定の例では、Cloud Translation API を使用して BigQuery を拡張するためのエンドツーエンドのチュートリアルを作成しました。  すべての手順は https://cloud.google.com/bigquery/docs/remote-functions-translation-tutorial で確認できます。

BigQuery の非構造化データ分析

非構造化データの分析は大変な作業です。リモート関数と Cloud Vision API を組み合わせると、組織は BigQuery プロンプトを離れることなく、SQL 経由で Google Cloud に保存されている画像や動画から分析情報を得ることができます。

組織は、画像にラベルを割り当てて、事前定義済みの何百万ものカテゴリに画像を迅速に分類したり、オブジェクトを検出したり、印刷されたテキストや手書きのテキストを読み取ったり、BigQuery に保存されている画像カタログに貴重なメタデータを組み込んだりできると想像してみてください。しかも、このすべての処理が BigQuery SQL を介して行われます。これがこの例のポイントです。

このユースケースについても、エンドツーエンドのわかりやすいチュートリアルを作成しました。すべての手順は、https://cloud.google.com/bigquery/docs/remote-function-tutorial で確認できます。

SQL を使用した自然言語による分析情報

Natural Language API を使用すると、ML を利用して非構造化データから分析情報を得ることができます。リモート関数を使用すると、このテキスト処理を BigQuery SQL と組み合わせることができます。  

この例では、Google の ML と SQL を使用して、BigQuery テーブルに保存された非構造化テキストから分析情報を引き出す機能に焦点を当てています。単純なユースケースとしては、ソーシャル メディアのコメントを収集して BigQuery に保存し、SQL を使用して各コメントの感情分析を実行するアプリケーションが考えられます。

サンプルコード(main.py と requirements.txt)は、このリポジトリにあります。

Python コードを Cloud Functions の関数としてデプロイしたら、以下の構文を使用して BigQuery リモート関数を作成できます。

読み込んでいます...

リモート関数の作成方法については、このドキュメントをご覧ください。

動作している関数のスクリーンショットは以下のようになります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/2-BQ_RF_NLP.max-2200x2200.jpg

セキュリティとコンプライアンス

個人を特定できる情報(PII)などの機密データの保護はあらゆるビジネスにとって不可欠です。

リモート関数を使用すると、SQL 呼び出しを実行して、Cloud Data Loss Prevention API によって提供される機能を統合でき、BigQuery からデータをエクスポートする必要がありません。リモート関数呼び出しは SQL を使いインラインで実行されるため、関数の結果をデータ操作の入力値として使用して、DML ステートメントもオンザフライで実行できます。

この例では、リモート関数と DLP を使用して、BigQuery テーブルに保存されているデータの決定的暗号化と復号を実行する機能に焦点を当てています。

サンプルコード(main.py と requirements.txt)は、ここにあります。以下のことに注意してください。

  • main.py の <change-me> への参照は、GCP 環境に応じて調整する必要があります

  • コードは、info_type が PHONE_NUMBEREMAIL_ADDRESSIP_ADDRESS のデータを検査します。必要に応じて調整してください

  • Cloud Key Management Service(KMS)API と Data Loss Prevention API を GCP プロジェクトで有効にする必要があります

  • DLP キーリングとキーが必要になります。手順については、ここをクリックしてください

  • キーをラップする必要があります(手順

  • DLP ユーザー ロールは、Cloud Functions の関数を実行するサービス アカウント(デフォルトでは Compute Engine のサービス アカウント)に割り当てる必要があります

Python コードを Cloud Functions の関数としてデプロイしたら、以下の構文を使用して BigQuery リモート関数を作成できます。

読み込んでいます...

リモート関数の詳細な作成方法については、このドキュメントをご覧ください。

電話番号に対して使用している確定的暗号化 / 復号は以下のとおりです。以下の図は、この関数によって暗号化される電話番号を示しています。

https://storage.googleapis.com/gweb-cloudblog-publish/images/3-BQ_RF_DLP_ENCRYPT.max-1300x1300.jpg

確定的暗号化および復号の技術が使用されているため、以下の図は、dlp_encrypt 関数によって作成されたハッシュ値を使用して dlp_decrypt 関数を呼び出すことによって、電話番号を復号して元の値に戻せることを示しています。

https://storage.googleapis.com/gweb-cloudblog-publish/images/4-BQ_RF_DLP_DECRYPT.max-1200x1200.jpg

以下は、call_details 列内にある電話番号、メールアドレス、またはメールの値を暗号化しながら、既存のテーブルからデータを選択する BigQuery テーブル作成の例です。

https://storage.googleapis.com/gweb-cloudblog-publish/images/5-BQ_RF_DLP_CREATE_TABLE.max-2200x2200.jpg

完全なデモ動画をここでご覧ください。

ELT と Data Catalog の更新

抽出、読み込み、変換(ELT)は、元データをソースサーバーから BigQuery などのターゲット サーバーに転送し、ダウンストリームで使用できるように情報を準備するデータ統合プロセスです。ELT を使用すると、元データがデータ ウェアハウスまたはデータレイクに読み込まれ、保存されたデータに対して変換が行われます。

BigQuery を使用する場合、変換は SQL で実行され、ストアド プロシージャ経由で呼び出されるのが一般的です。このシナリオでは、変換ロジックは自己完結型であり、BigQuery 内で実行されます。しかし、SQL 変換ジョブの実行中に Google Data Catalog などの外部システムを最新の状態に保つ必要がある場合はどうすればよいでしょうか。

これがこの例のポイントです。カタログの API とリモート関数のインラインで BigQuery ストアド プロシージャを呼び出して Data Catalog を更新できることがわかります。

サンプルコード(main.py と requirements.txt)は、ここにあります。以下のことに注意してください。

  • main.py の <your-tag-template-id> と <your-project-id> への参照は、GCP 環境に応じて調整する必要があります

  • タグ テンプレートの値が更新されるため、Cloud Functions の関数を実行するサービス アカウント(デフォルトでは Compute Engine のサービス アカウント)に Data Catalog 管理者ロール(または同等のロール)を割り当てる必要があります

  • 以下の構造のタグ テンプレートが存在します

https://storage.googleapis.com/gweb-cloudblog-publish/images/6-BQ_RF_DATACATALOG_TAG_TEMPLATE.max-1700x1700.jpg

Python コードを Cloud Functions の関数としてデプロイしたら、以下の構文を使用して BigQuery リモート関数を作成できます。

読み込んでいます...

Data Catalog の更新に使用されているリモート関数をご覧ください。以下の図は、関数を呼び出して、5 つのパラメータを渡す方法を示しています。

https://storage.googleapis.com/gweb-cloudblog-publish/images/7-BQ_RF_UPDATE_DC1.max-1400x1400.jpg

以下に、タグ テンプレート「BQ Remote Functions Demo Tag Template」が関数の実行後にどのように更新されるかを示します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/8-BQ_RF_UPDATE_DC2.max-2200x2200.jpg

完全な ELT ジョブを実行する BigQuery ストアド プロシージャ内でこの関数を使用できるようになりました。以下の例では、remote_udf.test_tag テーブルがストアド プロシージャによって更新されており、テーブル remote_udf.test_tag の更新された行数と合計行数が Data Catalog に保存されています。

https://storage.googleapis.com/gweb-cloudblog-publish/images/9-BQ_RF_UPDATE_DC3.max-2200x2200.jpg
https://storage.googleapis.com/gweb-cloudblog-publish/images/10-BQ_RF_UPDATE_DC4.max-2200x2200.jpg

完全なデモ動画をここでご覧ください。

SQL からの Pub/Sub 更新機能を備えたイベント ドリブン型アーキテクチャ

Pub/Sub は、ストリーミング分析と、データを取り込んで配布するためのデータ統合パイプラインに使用されます。これは、サービスの統合を目的としたメッセージ指向ミドルウェア、または、タスクを並列化するためのキューとしても使用されます。

BigQuery SQL 経由で Pub/Sub トピックにメッセージを投稿してイベントをトリガーする必要がある場合はどうすればよいでしょうか。以下に例を示します。

サンプルコード(main.py と requirements.txt)は、ここにあります。以下のことに注意してください。

  • main.py の <change-me> への参照は、project_id と topic_id を反映するように、GCP 環境に応じて調整する必要があります

  • Cloud Functions の関数を実行するサービス アカウント(デフォルトでは Compute Engine のサービス アカウント)には、Pub/Sub トピックにメッセージを投稿する権限が必要です

Python コードを Cloud Functions の関数としてデプロイしたら、以下の構文を使用して BigQuery リモート関数を作成できます。

読み込んでいます...

Pub/Sub トピックにメッセージを投稿するために使用されるリモート関数のスクリーンショットをいくつか以下に示します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/11-BQ_RF_PUBSUB1.max-1900x1900.jpg
https://storage.googleapis.com/gweb-cloudblog-publish/images/12-BQ_RF_PPUBSUB2.max-2200x2200.jpg

SQL から呼び出される Vertex AI モデルを使用したデータ サイエンス

Vertex AI では、複数の Google Cloud サービスがまとめられ、統合された UI および API のもとで ML を構築できるようになります。

BigQuery SQL 経由で Vertex AI モデルからオンライン予測を呼び出す必要がある場合はどうすればよいでしょうか。以下に例を示します。

サンプルコード(main.py と requirements.txt)は、ここにあります。以下のことに注意してください。

  • main.py の <change-me> への参照は、project_id、location、model_endpoint を反映するように、GCP 環境に応じて調整する必要があります

  • Cloud Functions の関数を実行するサービス アカウント(デフォルトでは Compute Engine のサービス アカウント)には、Vertex AI モデルを実行する権限が必要です。ロールは「AI Platform デベロッパー」で十分です

Python コードを Cloud Functions の関数としてデプロイしたら、以下の構文を使用して BigQuery リモート関数を作成できます。

読み込んでいます...

上記の関数例は、種、島、性別、体長、その他のパラメータの入力に基づいてペンギンの体重を予測します。

使用されるリモート関数のスクリーンショットをいくつか以下に示します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/13-BQ_RF_VERTEXAI0.max-1400x1400.jpg
https://storage.googleapis.com/gweb-cloudblog-publish/images/14-BQ_RF_VERTEXAI_1.max-2200x2200.jpg

リアルタイムでの外部 API の呼び出し

もう一つの一般的なユースケースは、最新の株価データ、天気予報、ジオコーディング情報を取得する外部 API を使用した BigQuery のデータ拡充です。使用中の外部サービスに応じて、クライアント コードを Cloud Functions の関数としてデプロイし、前に説明した例と同じ方法を使用してリモート関数と統合します。

以下は、ブラジルの通貨情報を取得するために外部 / 公開 API を呼び出すリモート関数の例のスクリーンショットです。

https://storage.googleapis.com/gweb-cloudblog-publish/images/15-BQ_RF_EXTERNAL_API0.max-1500x1500.jpg

まとめ

BigQuery リモート関数は、Cloud FunctionsCloud Run を直接統合することで、GoogleSQL 機能を BigQuery 以外のソフトウェアに組み込むことができます。

このブログを読んで、この非常に強力な BigQuery 機能を活用して BigQuery データを拡充する方法に関するアイデアを思いついていただければ幸いです。

ぜひ、BigQuery リモート UDF をお試しください。


- プリンシパル アーキテクト Carlos Augusto
データ分析担当プロダクト マネージャー Christopher Crosbie
投稿先