在表架构中指定 ObjectRef 列

本文档介绍了如何定义 BigQuery 标准表架构,使其包含可存储 ObjectRef 值的列。

ObjectRef 值提供 Cloud Storage 中对象的元数据和连接信息。当您需要将非结构化数据集成到标准表中时,请使用 ObjectRef 值。例如,在商品表中,您可以通过添加包含 ObjectRef 值的列,将商品图片与其余商品信息存储在同一行中。您可以将 ObjectRef 值存储在采用 ObjectRef 格式(即 STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>)的 STRUCT 列中。

如需详细了解如何处理多模态数据,请参阅分析多模态数据。 如需查看有关如何处理 ObjectRef 数据的教程,请参阅使用 SQL 分析多模态数据。 如需了解如何在 Python 中处理多模态数据,请参阅使用 BigQuery DataFrames 在 Python 中分析多模态数据

前提条件

如需在标准表中填充和更新 ObjectRef 值,该表必须具有 STRING 列,其中包含相关 Cloud Storage 对象的 URI 信息。

您必须拥有一个 Cloud Storage 存储桶,其中包含目标标准表的 URI 数据中标识的相同对象。如果您想使用对象表维护标准表中的 ObjectRef,则还必须有一个对象表来表示相应存储桶中的对象。

维持 ObjectRef

您可以使用对象表在标准表中填充和更新 ObjectRef 值。如果您在预览版的许可名单中,那么您创建的任何对象表都会有一个 ref 列,其中包含相应对象的 ObjectRef 值。您可以使用对象 URI 将标准表与对象表联接,以便填充和更新 ObjectRef 值。我们建议使用此方法,因为它可以避免从 Cloud Storage 检索对象元数据,从而提高可伸缩性。

如果您不想创建对象表,可以使用 OBJ.FETCH_METADATAOBJ.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_METADATAOBJ.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:一个 STRING 值,其中包含服务可用于访问 Cloud Storage 中对象的云资源连接,格式为 location.connection_id。例如,us-west1.myconnection。您可以通过在 Google Cloud 控制台中查看连接详细信息并复制连接 ID 中显示的完全限定连接 ID 的最后一部分中的值来获取连接 ID。例如,projects/myproject/locations/connection_location/connections/myconnection

      您必须向连接的服务账号授予 Storage Object User (roles/storage.objectUser) 角色,才能使用该服务账号访问任何 Cloud Storage 存储桶中的对象。

      连接必须与您调用函数的查询位于同一项目和区域中。

  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_METADATAOBJ.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:一个 STRING 值,其中包含服务可用于访问 Cloud Storage 中对象的云资源连接,格式为 location.connection_id。例如,us-west1.myconnection。您可以通过在 Google Cloud 控制台中查看连接详细信息并复制连接 ID 中显示的完全限定连接 ID 的最后一部分中的值来获取连接 ID。例如,projects/myproject/locations/connection_location/connections/myconnection

      您必须向连接的服务账号授予 Storage Object User (roles/storage.objectUser) 角色,才能使用该服务账号访问任何 Cloud Storage 存储桶中的对象。

      连接必须与您调用函数的查询位于同一项目和区域中。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

后续步骤