リモート関数を使用してオブジェクト テーブルを分析する

このドキュメントでは、リモート関数を使用して、オブジェクト テーブルの非構造化データを分析する方法について説明します。

概要

リモート関数を使用して、オブジェクト テーブルで表される非構造化データを分析できます。リモート関数を使用すると、Cloud Functions または Cloud Run で実行されている関数を呼び出して、次のようなリソースにアクセスするようにプログラムできます。

  • Google の事前トレーニング済み AI モデル(Cloud Vision API や Document AI など)。
  • Apache Tika などのオープンソース ライブラリ。
  • 独自のカスタムモデル。

リモート関数を使用してオブジェクト テーブルのデータを分析するには、リモート関数を呼び出すときに、オブジェクト テーブル内のオブジェクトの署名付き URL を生成して渡す必要があります。これらの署名付き URL によって、リモート関数にオブジェクトへのアクセス権が付与されます。

必要な権限

  • リモート関数が使用する接続リソースを作成するには、次の権限が必要です。

    • bigquery.connections.create
    • bigquery.connections.get
    • bigquery.connections.list
    • bigquery.connections.update
    • bigquery.connections.use
    • bigquery.connections.delete
  • リモート関数を作成するには、Cloud Functions デベロッパーまたは Cloud Run デベロッパーのロールに関連付けられた権限が必要です。

  • リモート関数を呼び出すには、リモート関数で説明されている権限が必要です。

  • リモート関数を使用してオブジェクト テーブルを分析するには、オブジェクト テーブルに対する bigquery.tables.getData 権限が必要です。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery, BigQuery Connection API, Cloud Functions APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery, BigQuery Connection API, Cloud Functions APIs.

    Enable the APIs

  8. BigQuery 管理者が接続を作成済みで、Cloud Storage へのアクセスを設定していることを確認します。

リモート関数を作成する

リモート関数を作成する一般的な手順については、リモート関数の操作をご覧ください。

オブジェクト テーブルデータを分析するリモート関数を作成する場合は、オブジェクト テーブル内のオブジェクトに対して生成された署名付き URL を渡す必要があります。これを行うには、STRING データ型の入力パラメータを使用します。署名付き URL は、リモート関数で HTTP POST リクエストの calls フィールドに入力データとして使用できるようにします。以下はリクエストの例です。

{
  // Other fields omitted.
  "calls": [
    ["https://storage.googleapis.com/mybucket/1.pdf?X-Goog-SignedHeaders=abcd"],
    ["https://storage.googleapis.com/mybucket/2.pdf?X-Goog-SignedHeaders=wxyz"]
  ]
}

署名付き URL に HTTP GET リクエストを送信するメソッドを使用すると、リモート関数内のオブジェクトを読み取ることができます。署名付き URL のクエリ文字列に認証情報が含まれているため、リモート関数はオブジェクトにアクセスできます。

リモート関数の CREATE FUNCTION ステートメントを指定する場合は、Cloud Functions のタイムアウトを回避し、並列処理を増やすために max_batching_rows オプションを 1 に設定することをおすすめします。

次の Cloud Functions Python コードの例は、ストレージ オブジェクトを読み取り、それらのコンテンツの長さを BigQuery に返します。

import functions_framework
import json
import urllib.request

@functions_framework.http
def object_length(request):
  calls = request.get_json()['calls']
  replies = []
  for call in calls:
    object_content = urllib.request.urlopen(call[0]).read()
    replies.append(len(object_content))
  return json.dumps({'replies': replies})

デプロイされると、この関数には https://us-central1-myproject.cloudfunctions.net/object_length のようなエンドポイントが設定されます。

次の例は、この Cloud Functions の関数に基づいて BigQuery リモート関数を作成する方法を示しています。

CREATE FUNCTION mydataset.object_length(signed_url STRING) RETURNS INT64
REMOTE WITH CONNECTION `us.myconnection`
OPTIONS(
  endpoint = "https://us-central1-myproject.cloudfunctions.net/object_length",
  max_batching_rows = 1
);

詳しい手順については、チュートリアル: リモート関数を使用してオブジェクト テーブルを分析するをご覧ください。

リモート関数を呼び出す

オブジェクト テーブルデータでリモート関数を呼び出すには、クエリの select_list でリモート関数を参照し、FROMEXTERNAL_OBJECT_TRANSFORM 関数を呼び出して、オブジェクトの署名付き URL を生成します。

次の例は、一般的なステートメントの構文を示しています。

SELECT uri, function_name(signed_url) AS function_output
FROM EXTERNAL_OBJECT_TRANSFORM(TABLE my_dataset.object_table, ["SIGNED_URL"])
LIMIT 10000;

次の例は、リモート関数を使用してオブジェクト テーブル コンテンツのサブセットのみを処理する方法を示しています。

SELECT uri, function_name(signed_url) AS function_output
FROM EXTERNAL_OBJECT_TRANSFORM(TABLE my_dataset.object_table, ["SIGNED_URL"])
WHERE content_type = "application/pdf";

次のステップ