对象表简介

本文档介绍了对象表,该表是 Cloud Storage 中非结构化数据对象的只读表。

对象表可让您分析 Cloud Storage 中的非结构化数据。您可以使用远程函数执行分析,或使用 BigQuery ML 执行推理,然后将这些操作的结果与 BigQuery 中的其余结构化数据进行联接。

与 BigLake 表一样,对象表使用访问权限委托功能,将对对象表的访问权限与对 Cloud Storage 对象的访问权限分离开来。与服务账号关联的外部连接用于连接到 Cloud Storage,因此您只需向用户授予访问对象表的权限。这样,您就可以强制执行行级安全措施,并管理用户有权访问哪些对象。

对象表架构

对象表提供指定 Cloud Storage 存储桶中的非结构化数据对象的元数据索引。表中的每一行对应一个对象,表列对应于 Cloud Storage 生成的对象元数据(包括所有自定义元数据)。

对象表还包含一个 data 伪列,该伪列表示原始字节的文件内容,系统在创建对象表时会自动填充该列。当您对图片数据运行推理时,ML.DECODE_IMAGE 函数会使用此伪列。您不能在查询中包含 data 伪列,它不会显示为对象表架构的一部分。

下表介 绍了对象表使用的固定架构:

字段名称 类型 Mode 说明
uri STRING 可以为空 uri:对象的统一资源标识符 (URI),格式为 gs://bucket_name/[folder_name/]object_name
generation INTEGER 可以为空 此对象的世代,用于标识对象版本。
content_type STRING 可以为空 对象数据的 Content-Type,用于标识媒体的类型。如果存储的对象没有 Content-Type,则它作为应用/八位字节流传送。
size INTEGER 可以为空 数据的 Content-Length(以字节为单位)。
md5_hash STRING 可以为空 数据的 MD5 哈希,使用 base64 编码。如需详细了解如何使用 MD5 哈希,请参阅 Cloud Storage 哈希和 ETag
updated TIMESTAMP 可以为空 上次修改对象元数据的时间。
metadata RECORD 重复 对象的自定义元数据。每个元数据都表示为 metadata 字段的子级 (metadata.)name(metadata.)value 字段中的键值对。
(metadata.)name STRING 可以为空 单个元数据条目中的键。
(metadata.)value STRING 可以为空 单个元数据条目中的值。

对象表中的行类似于以下内容:

------------------------------------------------------------------------------------------------------------------------------------------------
|  uri                 | generation | content_type | size  | md5_hash   | updated                        | metadata...name | metadata...value  |
-----------------------------------------------------------------------------------------------------------------------------------------------
| gs://mybucket/a.jpeg | 165842…    | image/jpeg   | 26797 | 8c33be10f… | 2022-07-21 17:35:40.148000 UTC | null            | null              |
-----------------------------------------------------------------------------------------------------------------------------------------------
| gs://mybucket/b.bmp  | 305722…    | image/bmp    | 57932 | 44eb90cd1… | 2022-05-14 12:09:38.114000 UTC | null            | null              |
-----------------------------------------------------------------------------------------------------------------------------------------------

使用场景

您可以按照与查询任何其他 BigQuery 表相同的方式查询对象表中的元数据。但是,对象表的主要使用场景是使非结构化数据可用于分析。您可以通过 BigQuery ML,使用 TensorFlow、TensorFlow Lite 和 PyTorch 模型对图片对象表运行推理。您还可以使用远程函数以几乎您想要的任何方式分析非结构化数据。例如,您可以创建一个可让您使用 Cloud Vision 分析图片的远程函数,也可以创建一个可让您使用 Apache Tika 从 PDF 文档中提取元数据的远程函数。

下表介绍了可用于基于对象表数据执行机器学习的集成点:

集成 说明 用例 教程
导入的 BigQuery ML 模型 TensorFlowTensorFlow LiteONNX 模型导入 BigQuery ML,以在 BigQuery 中运行本地推理。 您使用的是符合受支持的限制的开源或自定义模型。 教程:使用特征向量模型对对象表运行推理
Cloud Functions 使用 Cloud Functions 调用服务或托管模型。这是最通用的集成。 您在 Compute Engine、Google Kubernetes Engine 或其他客户拥有的基础架构上自托管模型。 教程:使用远程函数分析对象表
ML.ANNOTATE_IMAGE 函数 使用 Cloud Vision API 为图片添加注释。 您希望使用 Vision API 预训练模型为图片添加注释。 使用 ML.ANNOTATE_IMAGE 函数为图片添加注解
ML.PROCESS_DOCUMENT 函数 使用 Document AI API 提取文档数据分析。 您希望使用 Document AI 预训练或自定义文档处理器。 使用 ML.PROCESS_DOCUMENT 函数处理文档
ML.TRANSCRIBE 函数 使用 Speech-to-Text API 转写音频文件。 您希望使用 Speech-to-Text 预训练或自定义语音识别器。 使用 ML.TRANSCRIBE 函数转写音频文件

如果要将结果与其他结构化数据联接,可以从分析结果创建视图或表。例如,以下语句根据推理结果创建表:

CREATE TABLE my_dataset.my_inference_results AS
SELECT uri, content_type, vision_feature
FROM ML.PREDICT(
  MODEL my_dataset.vision_model,
  SELECT ML.DECODE_IMAGE(data) AS vision_input
  FROM my_dataset.object_table
);

创建表后,您可以根据标准或自定义元数据字段将该表与其他表联接,如下所示:

SELECT a.vision_feature, a.uri, b.description
FROM my_dataset.my_inference_results a
JOIN my_dataset.image_description b
ON a.uri = b.uri;

您还可以创建搜索索引,为分析结果搜索提供支持。例如,以下语句会针对从 PDF 文件中提取的数据创建搜索索引:

CREATE SEARCH INDEX my_index ON pdf_text_extract(ALL COLUMNS);

然后,您可以使用索引在这些结果中查找所需内容:

SELECT * FROM pdf_text_extract WHERE SEARCH(pdf_text, 'Google');

优势

在 BigQuery 中以原生方式分析非结构化数据具有以下优势:

  • 它使您可以自动执行预处理步骤(例如根据模型要求调整图片大小),从而减少手动工作量。
  • 它可让您使用简单而熟悉的 SQL 接口来处理非结构化数据。
  • 它利用现有的 BigQuery 槽(而无需预配新形式的计算)帮助您节省费用。

签名网址

若要访问由对象表示的数据,请生成签名网址。您可以使用签名网址直接查看对象数据,还可以将签名网址传递给远程函数,以使它们能够处理对象表数据。

使用 EXTERNAL_OBJECT_TRANSFORM 函数生成签名网址,如以下示例所示:

SELECT uri, signed_url
FROM EXTERNAL_OBJECT_TRANSFORM(TABLE mydataset.myobjecttable, ['SIGNED_URL']);

这将返回如下所示的结果:

---------------------------------------------------------------------------------------------------
|  uri                 | signed_url                                                               |
--------------------------------------------------------------------------------------------------
| gs://mybucket/a.docx | https://storage.googleapis.com/mybucket/a.docx?X-Goog-Signature=abcd&... |
-------------------------------------------------------------------------------------------------
| gs://mybucket/b.pdf  | https://storage.googleapis.com/mybucket/b.pdf?X-Goog-Signature=wxyz&...  |
--------------------------------------------------------------------------------------------------

通过对象表生成的签名网址使拥有它们的任何用户或过程都可以读取相应的对象。生成的签名网址会在 6 小时后过期。如需了解详情,请参阅 Cloud Storage 签名网址

访问权限控制

对象表基于 BigLake 构建,因此它们使用基于服务账号的外部连接来访问 Cloud Storage 数据。这样,您就可以通过访问权限委派将对表的访问权限与对底层对象存储的访问权限相分离。您可以授予服务账号访问对象中的数据和元数据的权限,并将其显示在表中。您可以只授予用户对表的权限,以便使用 Identity and Access Management (IAM) 和行级安全性来控制数据访问权限。

对象表与使用访问权限委派的其他表不同,因为有权访问对象表的行意味着有权访问底层文件内容。虽然用户无法直接访问对象,但可以生成可让其查看文件内容的签名网址。例如,如果用户有权访问表示 flower.jpg 图片文件的对象表行,则可以生成一个签名网址以显示该文件并且看到它是一张雏菊图片。

在对象表上设置行级访问权限政策可以限制用户或群组对所选行中的对象元数据的访问权限,以及对这些行表示的对象的访问权限。例如,以下语句仅授予用户 Alice 访问代表 2022 年 6 月 25 日之前创建的对象的行:

CREATE ROW ACCESS POLICY before_20220625
ON my_dataset.my_object_table
GRANT TO ("user:alice@example.com")
FILTER USING (updated < TIMESTAMP("2022-06-25"));

实施此行级访问权限政策后,Alice 将获得以下结果:

  • 运行查询 SELECT * FROM my_dataset.my_object_table; 只会返回 updated 值在 2022 年 6 月 25 日之前的行。
  • my_dataset.my_object_table 运行推理只会返回 updated 值在 2022 年 6 月 25 日之前的对象的预测结果。
  • my_dataset.my_object_table 生成签名网址只会为 updated 值在 2022 年 6 月 25 日之前的对象创建网址。

您还可以使用自定义元数据限制对对象表行的访问权限。例如,以下语句限制 users 群组只能访问对象被标记为不包含任何个人身份信息的行:

CREATE ROW ACCESS POLICY no_pii
ON my_dataset.my_object_table
GRANT TO ("group:users@example.com")
FILTER USING (ARRAY_LENGTH(metadata)=1
AND metadata[OFFSET(0)].name="no_pii")

安全模型

管理和使用对象表通常涉及以下组织角色:

  • 数据湖管理员。这些管理员通常负责管理针对 Cloud Storage 存储桶和对象的 Identity and Access Management (IAM) 政策。
  • 数据仓库管理员。这些管理员通常负责创建、删除和更新表。
  • 数据分析师。分析师通常读取数据和运行查询。

数据湖管理员负责创建连接并与数据仓库管理员共享连接。而数据仓库管理员可以创建表、设置适当的访问控制,以及与数据分析师共享表。

支持的对象文件

您可以基于任何类型和大小的非结构化数据文件创建对象表,并且可以创建远程函数来处理任何类型的非结构化数据。但是,如需使用 BigQuery ML 执行推理,对象表只能基于满足多种大小和类型要求的图片文件。如需了解详情,请参阅限制

启用元数据缓存以提高性能

您可以使用缓存的元数据提高对象表的推理和其他类型的分析的性能。在对象表引用大量对象的情况下,元数据缓存特别有用。元数据包括文件中的文件名、分区信息和物理元数据(例如行数)。您可以选择是否为表启用元数据缓存。包含大量文件和使用 Hive 分区过滤条件的查询从元数据缓存中获益最多。

如果您未启用元数据缓存,则针对表的查询必须读取外部数据源以获取对象元数据,这会增加查询延迟时间;列出来自外部数据源的数百万个文件可能需要几分钟的时间。如果启用了元数据缓存,查询可以避免列出外部数据源中的文件,从而加快分区和文件删减速度。

有两个属性可以控制此功能:

  • 最大过时,控制查询使用缓存元数据的时间。
  • 元数据缓存模式,控制元数据的收集方式。

启用元数据缓存后,您需要指定对表执行的操作可以接受的元数据过时的最大间隔时间。例如,当指定间隔时间为 1 小时的时候,如果缓存的元数据在过去 1 小时内刷新,针对表的操作会使用缓存的元数据。如果缓存的元数据早于该值,操作会回退到从 Cloud Storage 检索元数据。您可以指定从 30 分钟到 7 天的过时间隔时间。

您可以选择自动或手动刷新缓存:

  • 对于自动刷新,缓存会按系统定义的间隔时间刷新,间隔时间通常为 30 到 60 分钟。如果 Cloud Storage 中的文件添加、删除或修改的间隔时间是随机的,则自动刷新缓存是一种很好的方法。如果您需要控制刷新的时间(例如在提取-转换-加载作业结束时触发刷新),请使用手动刷新。
  • 对于手动刷新,您需要运行 BQ.REFRESH_EXTERNAL_METADATA_CACHE 系统过程,以按符合要求的时间表刷新元数据缓存。如果 Cloud Storage 中的文件添加、删除或修改的间隔时间是已知的(例如作为流水线的输出),则手动刷新缓存是一种很好的方法。

    如果您发出多个并发手动刷新,则只有一个刷新会成功。

如果元数据缓存在 7 天内没有刷新,则会失效。

在设置过时间隔时间和元数据缓存模式值之前,您应该考虑它们的交互方式。请参考以下示例:

  • 如果您要手动刷新表的元数据缓存并将过时间隔时间设置为 2 天,那么如果希望针对该表的操作使用缓存的元数据,您必须每 2 天(或更短时间)运行一次 BQ.REFRESH_EXTERNAL_METADATA_CACHE 系统过程。
  • 如果您要自动刷新表的元数据缓存并将过时间隔时间设置为 30 分钟,那么在缓存刷新的间隔时间较长(通常为 30 到 60 分钟)的情况下,针对该表的某些操作可能会从 Cloud Storage 读取。

如需查找元数据刷新作业的相关信息,请查询 INFORMATION_SCHEMA.JOBS 视图,如以下示例所示:

SELECT *
FROM `region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT`
WHERE job_id LIKE '%metadata_cache_refresh%'
AND creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 6 HOUR)
ORDER BY start_time DESC
LIMIT 10;

如需了解详情,请参阅元数据缓存

如需详细了解如何设置元数据缓存选项,请参阅创建对象表

限制

  • 对象表是只读的,因为它们映射到 Cloud Storage 中的非结构化数据对象。您无法更改对象表或修改对象表数据。
  • 旧版 SQL 或其他云环境(例如 AWS 和 Microsoft Azure)不支持对象表。
  • 如果要使用 BigQuery ML 执行推理,您使用的模型和对象表必须满足限制中所述的要求。
  • 包含对象表的查询无法访问超过 10 GB 的对象元数据。例如,如果通过签名网址从对象表和对象数据的组合访问 100 TB,则元数据列中只能有 10 GB 的 100 TB。
  • 对象表受到与其他 BigQuery 外部表相同的限制。如需了解详情,请参阅配额
  • 对对象表的查询受到与所有其他 BigQuery 查询相同的限制。如需了解详情,请参阅配额
  • 处理对象表中的非结构化数据的远程函数与所有其他远程函数受到相同的限制
  • 为对象表中的对象生成的签名网址会在 6 小时(即查询执行时间限制)后过期。
  • 按需价格或标准版不支持使用 BigQuery ML 进行推理。
  • 按需价格或标准版不支持以下函数:

费用

费用与对象表的以下方面相关联:

如果您具有槽预留,则无需为查询外部表付费。这些查询会使用槽。

下表显示了您的价格模式如何影响这些费用的应用:


按需价格

标准版、企业版和企业 Plus 版

查询

您需要为用户查询处理的字节数付费

具有 QUERY 作业类型的预留分配中的会在查询期间使用。

手动刷新元数据缓存。

您需要为刷新缓存所处理的字节数付费

具有 QUERY 作业类型的预留分配中的会在缓存刷新期间使用。

自动刷新元数据缓存。

您需要为刷新缓存所处理的字节数付费

具有 BACKGROUND 作业类型的预留分配中的会在缓存刷新期间使用。

如果没有可用的 BACKGROUND 预留来刷新元数据缓存,并且您使用的是企业版或企业 Plus 版,则 BigQuery 会自动改用 QUERY 预留中的槽。

将对象表与 Analytics Hub 搭配使用

对象表与 Analytics Hub 兼容。包含对象表的数据集可以作为 Analytics Hub 列表发布。Analytics Hub 订阅者可以订阅这些列表,这些列表会在其项目中预配一个只读数据集(也称为关联的数据集)。订阅方可以查询关联的数据集中的所有表,包括所有对象表。如需了解详情,请参阅订阅列表

后续步骤