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

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

ObjectRef 値は、Cloud Storage 内のオブジェクトのメタデータと接続情報を提供します。非構造化データを標準テーブルに統合する必要がある場合は、ObjectRef 値を使用します。たとえば、products テーブルで、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 バケットのサービス アカウントに、ストレージ オブジェクト ユーザー(roles/storage.objectUser)ロールを付与する必要があります。

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

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

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

ARRAY<ObjectRef> 列を作成する

ARRAY<STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>> 列を作成して、ObjectRef 値の配列を含めることができます。たとえば、動画を個別の画像に分割し、これらの画像を 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 バケットのサービス アカウントに、ストレージ オブジェクト ユーザー(roles/storage.objectUser)ロールを付与する必要があります。

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

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

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

次のステップ