テーブル スキーマで ObjectRef 列を指定する

このドキュメントでは、ObjectRef 値を格納できる列を使用して BigQuery 標準テーブル スキーマを定義する方法について説明します。

ObjectRef 値は、Cloud Storage 内のオブジェクトのメタデータと接続情報を提供します。非構造化データを標準テーブルに統合する必要がある場合は、ObjectRef 値を使用します。たとえば、商品テーブルで、ObjectRef 値を含む列を追加して、商品画像とその他の商品情報を同じ行に保存できます。ObjectRef 値は、ObjectRef 形式STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>)を使用する STRUCT 列に保存できます。

マルチモーダル データの操作の詳細については、マルチモーダル データを分析するをご覧ください。ObjectRef データの操作方法を示すチュートリアルについては、SQL を使用してマルチモーダル データを分析するをご覧ください。Python でマルチモーダル データを扱う方法については、BigQuery DataFrames を使用して Python でマルチモーダル データを分析するをご覧ください。

前提条件

標準テーブルの ObjectRef 値を入力して更新するには、関連する Cloud Storage オブジェクトの URI 情報を含む STRING 列がテーブルに必要です。

ターゲット標準テーブルの URI データで識別されるオブジェクトと同じオブジェクトを含む Cloud Storage バケットが必要です。オブジェクト テーブルを使用して標準テーブルの ObjectRef 値を維持する場合は、そのバケット内のオブジェクトを表すオブジェクト テーブルも必要です。

ObjectRef 値の維持

オブジェクト テーブルを使用して、標準テーブルの ObjectRef 値を入力して更新できます。プレビューの許可リストに登録されている場合、作成するオブジェクト テーブルには、特定のオブジェクトの ObjectRef 値を含む ref 列があります。オブジェクト URI を使用して標準テーブルをオブジェクト テーブルに結合し、ObjectRef 値を入力して更新できます。この方法では Cloud Storage からオブジェクト メタデータを取得する必要がないため、拡張性の面でおすすめします。

オブジェクト テーブルを作成しない場合は、OBJ.FETCH_METADATA 関数と OBJ.MAKE_REF 関数を使用して、Cloud Storage からオブジェクト メタデータを直接取得して ObjectRef 値を入力し、更新できます。このアプローチでは、Cloud Storage からオブジェクト メタデータを取得する必要があるため、拡張性が低くなる可能性があります。

ObjectRef 列を作成する

標準テーブルに ObjectRef 列を作成してデータを入力するには、次のいずれかのオプションを選択します。

オブジェクト テーブル

オブジェクト テーブル ref 列のデータに基づいて ObjectRef 列を作成して入力します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE OR REPLACE TABLE PROJECT_ID.DATASET_ID.TABLE_NAME AS SELECT TABLE_NAME.*, OBJECT_TABLE.ref AS objectrefcolumn FROM DATASET_ID.TABLE_NAME INNER JOIN DATASET_ID.OBJECT_TABLE ON OBJECT_TABLE.uri = TABLE_NAME.uri;

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID。現在のプロジェクトでテーブルを作成する場合は、この引数を省略できます。
    • DATASET_ID: 作成するデータセットの ID。
    • TABLE_NAME: 再作成する標準テーブルの名前。
    • OBJECT_TABLE: 標準テーブルに統合するオブジェクト データを含むオブジェクト テーブルの名前。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

SQL 関数

OBJ.FETCH_METADATA 関数と OBJ.MAKE_REF 関数の出力に基づいて ObjectRef 列を作成して入力します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE OR REPLACE TABLE PROJECT_ID.DATASET_ID.TABLE_NAME AS SELECT TABLE_NAME.*, OBJ.FETCH_METADATA(OBJ.MAKE_REF(uri, 'CONNECTION_ID')) AS objectrefcolumn FROM DATASET_ID.TABLE_NAME;

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID。現在のプロジェクトでテーブルを作成する場合は、この引数を省略できます。
    • DATASET_ID: 作成するデータセットの ID。
    • TABLE_NAME: 再作成する標準テーブルの名前。
    • CONNECTION_ID: サービスが Cloud Storage 内のオブジェクトにアクセスするために使用できるクラウド リソース接続を含む STRING 値。形式は location.connection_id です。例: us-west1.myconnection。接続 ID は、 Google Cloud コンソールで接続の詳細を表示し、[接続 ID] に表示される完全修飾接続 ID の最後のセクションの値をコピーすることで取得できます。例: projects/myproject/locations/connection_location/connections/myconnection

      オブジェクトへのアクセスに使用する Cloud Storage バケットの接続のサービス アカウントに、Storage オブジェクト ユーザー(roles/storage.objectUser)ロールを付与する必要があります。

      接続は、関数を呼び出すクエリと同じプロジェクトとリージョンに存在する必要があります。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

ARRAY<ObjectRef> 列を作成する

ObjectRef 値の配列を含む ARRAY<STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>> 列を作成できます。たとえば、動画を個別の画像にチャンク分割し、これらの画像を ObjectRef 値の配列として保存できます。

ARRAY_AGG 関数を使用して、ObjectRef 値の配列を集計できます。必要に応じて ORDER BY 句を使用してオブジェクトの順序を保持することもできます。UNNEST 演算子を使用して、ObjectRef 値の配列を個々の ObjectRef 値に解析できます。必要に応じて、WITH OFFSET 句を使用してオブジェクトの順序を保持することもできます。URI パスやオブジェクト ファイル名などのオブジェクト メタデータを使用して、オブジェクト チャンクを表す ObjectRef 値を元のオブジェクトを表す ObjectRef 値にマッピングできます。

ObjectRef 値の配列を操作する方法の例については、SQL でマルチモーダル データを分析するチュートリアルの ARRAY<ObjectRef> 値を使用して順序付きマルチモーダル データを処理するをご覧ください。

ObjectRef 列を更新する

標準テーブルの ObjectRef 列を更新するには、次のいずれかのオプションを選択します。

オブジェクト テーブル

オブジェクト テーブルの ref 列のデータを使用して ObjectRef 列を更新します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    UPDATE PROJECT_ID.DATASET_ID.TABLE_NAME SET objectrefcolumn = (SELECT ref FROM DATASET_ID.OBJECT_TABLE WHERE OBJECT_TABLE.uri = TABLE_NAME.uri) WHERE uri != "";

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID。現在のプロジェクトでテーブルを作成する場合は、この引数を省略できます。
    • DATASET_ID: 作成するデータセットの ID。
    • TABLE_NAME: 再作成する標準テーブルの名前。
    • OBJECT_TABLE: 標準テーブル ObjectRef 列と同じオブジェクト データを含むオブジェクト テーブルの名前。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

SQL 関数

OBJ.FETCH_METADATA 関数と OBJ.MAKE_REF 関数の出力を使用して ObjectRef 列を更新します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    UPDATE PROJECT_ID.DATASET_ID.TABLE_NAME SET objectrefcolumn = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF(uri, 'CONNECTION_ID'))) WHERE uri != "";

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID。現在のプロジェクトでテーブルを作成する場合は、この引数を省略できます。
    • DATASET_ID: 作成するデータセットの ID。
    • TABLE_NAME: 再作成する標準テーブルの名前。
    • CONNECTION_ID: サービスが Cloud Storage 内のオブジェクトにアクセスするために使用できるクラウド リソース接続を含む STRING 値。形式は location.connection_id です。例: us-west1.myconnection。接続 ID は、 Google Cloud コンソールで接続の詳細を表示し、[接続 ID] に表示される完全修飾接続 ID の最後のセクションの値をコピーすることで取得できます。例: projects/myproject/locations/connection_location/connections/myconnection

      オブジェクトへのアクセスに使用する Cloud Storage バケットの接続のサービス アカウントに、Storage オブジェクト ユーザー(roles/storage.objectUser)ロールを付与する必要があります。

      接続は、関数を呼び出すクエリと同じプロジェクトとリージョンに存在する必要があります。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

次のステップ