BigLake 表简介
本文档简要介绍 BigLake,并假定您熟悉数据库表和 Identity and Access Management (IAM)。如需查询存储在受支持的数据存储区中的数据,您必须先创建 BigLake 表,然后使用 GoogleSQL 语法查询这些表:
您还可以将外部表升级到 BigLake。如需了解详情,请参阅将外部表升级到 BigLake。
利用 BigLake 表,您可以使用委托访问权限功能来查询外部数据存储区中的结构化数据。委托访问权限功能将对 BigLake 表的访问权限与对底层数据存储区的访问权限分离。与服务账号关联的外部连接用于连接到数据存储区。由于服务账号负责从数据存储区中检索数据,因此您只需授予用户访问 BigLake 表的权限。这样,您就可以在表级层强制执行精细的安全措施,包括行级和列级安全措施。对于基于 Cloud Storage 的 BigLake 表,您还可以使用动态数据遮盖。 如需详细了解将 BigLake 表与 Amazon S3 或 Blob Storage 数据配合使用的多云分析解决方案,请参阅 BigQuery Omni。
支持的数据存储区
您可以将 BigLake 表与以下数据存储区结合使用:
- Amazon S3(通过使用 BigQuery Omni)
- Blob Storage(通过使用 BigQuery Omni)
- Cloud Storage
临时表支持
基于 Cloud Storage 的 BigLake 表可以是临时的,也可以是永久的。基于 Amazon S3 或 Blob Storage 的 BigLake 表必须是永久表。
多个源文件
您可以根据多个外部数据源创建 BigLake 表,只要这些数据源具有相同的架构即可。
跨云联接
跨云联接可让您跨 Google Cloud 和 BigQuery Omni 区域运行查询。您可以使用 GoogleSQL JOIN
操作跨多个不同的存储解决方案(如 AWS、Azure、公共数据集和其他 Google Cloud 服务)分析数据。使用跨云联接,您无需在运行查询之前跨源复制数据。
您可以在 SELECT
语句中的任何位置引用 BigLake 表,就像它们是标准 BigQuery 表一样,包括在使用子查询检索数据的数据操纵语言 (DML) 和数据定义语言 (DDL) 语句中都是如此。您可以在同一查询中使用来自不同云的多个 BigLake 表和 BigQuery 表。所有 BigQuery 表必须来自同一区域。
跨云联接所需的权限
如需获得运行跨云联接所需的权限,请让您的管理员在执行联接的项目上为您授予 BigQuery Data Editor (roles/bigquery.dataEditor
) IAM 角色。
如需详细了解如何授予角色,请参阅管理访问权限。
此预定义角色包含运行跨云联接所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需运行跨云联接,需要具备以下权限:
-
bigquery.datasets.create
-
bigquery.tables.create
如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅 IAM 简介。
跨云联接费用
运行跨云联接操作时,BigQuery 会将查询解析为本地部分和远程部分。本地部分被视为 BigQuery 区域中的标准查询。远程部分会被转换为 BigQuery Omni 区域中被引用的 BigLake 表上的 CREATE TABLE AS SELECT
(CTAS) 操作,这会在 BigQuery 区域中创建一个临时表。
然后,BigQuery 使用此临时表执行跨云联接,并在 8 小时后自动删除该表。
您需要为被引用的 BigLake 表中的数据支付数据转移费用。但是,BigQuery 通过仅转移 BigLake 表中被引用的列和行(而不是整个表)来帮助减少这些费用。我们建议您指定范围尽可能窄的列过滤条件,以进一步降低数据转移费用。CTAS 作业会显示在您的作业历史记录中,并显示转移的字节数等信息。即使主查询作业失败,成功的转移也会产生费用。如需了解详情,请参阅 BigQuery Omni 价格。
请考虑以下查询示例:
SELECT * FROM bigquery_dataset.bigquery_table AS clients WHERE clients.sales_rep IN ( SELECT id FROM aws_dataset.aws_table1 AS employees INNER JOIN aws_dataset.aws_table2 AS active_employees ON employees.id = active_employees.id WHERE employees.level > 3 );
此示例有两个转移作业:一个来自员工表(具有等级过滤条件),另一个来自活跃员工表。转移完成后,将在 BigQuery 区域中执行联接。如果一个转移作业失败而另一个成功,成功的转移作业仍会产生数据转移费用。
跨云联接限制
- BigQuery 免费层级和 BigQuery 沙盒不支持跨云联接。
- 来自同一区域的多个 BigLake 表的联接不会下推到 BigQuery Omni 区域。
- 如果查询包含
JOIN
语句,则聚合可能不会下推到 BigQuery Omni 区域。 - 每个临时表仅用于单个跨云查询,即使同一查询多次重复,也不会重复使用。
- 每个转移作业的大小上限为 20 GB。具体而言,如果您对 BigLake 表应用过滤条件并加载结果,则其必须小于 20 GB。如果需要,您可以申请提高配额限制。扫描的字节数没有限制。
- 跨云联接查询对查询速率采用内部配额。如果查询速率超过配额,您可能会收到
All our servers are busy processing data transferred between regions
错误。重试查询在大多数情况下应该都有效。请联系支持团队增加内部配额,以支持更高的查询率。 - 只有在包含相应 BigQuery Omni 区域的共置 BigQuery 区域以及
US
和EU
多区域中支持跨云联接。在US
或EU
多区域中运行的跨云联接只能分别访问美国或欧盟 BigQuery Omni 区域中的数据。 - 如果跨云联接查询引用了来自 BigQuery Omni 区域的 10 个或更多数据集,则它可能会失败并显示错误
Not found: Dataset <BigQuery dataset> was not found in location <BigQuery Omni region>
。为避免此问题,在运行引用 10 个以上数据集的跨云联接时,我们建议您明确指定位置。请注意,如果您明确指定 BigQuery 区域,并且查询仅包含 BigLake 表,则查询将作为跨云查询运行并产生数据转移费用。 - 您无法使用跨云联接查询
_FILE_NAME
伪列。 - 在
WHERE
子句中引用 BigLake 表的列时,您不能使用NUMERIC
、BIGNUMERIC
、BYTES
、TIME
或INTERVAL
字面量。 - 跨云联接作业不会报告处理和从其他云转移的字节数。此信息在跨云查询执行过程中创建的子 CTAS 作业中提供。
- 只有 BigQuery Omni 区域支持引用 BigQuery Omni 表或视图的已获授权的视图和已获授权的例程。
跨云联接示例
以下查询将 BigQuery 区域中的 orders
表与 BigQuery Omni 区域中的 lineitem
表联接:
SELECT l_shipmode, o_orderpriority, count(l_linenumber) AS num_lineitems FROM bigquery_dataset.orders JOIN aws_dataset.lineitem ON orders.o_orderkey = lineitem.l_orderkey WHERE l_shipmode IN ('AIR', 'REG AIR') AND l_commitdate < l_receiptdate AND l_shipdate < l_commitdate AND l_receiptdate >= DATE '1997-01-01' AND l_receiptdate < DATE '1997-02-01' GROUP BY l_shipmode, o_orderpriority ORDER BY l_shipmode, o_orderpriority;
此查询被分为本地部分和远程部分。以下查询会发送到 BigQuery Omni 区域以首先执行。结果是 BigQuery 区域中的临时表。您可以在作业历史记录中查看此子 CTAS 作业及其元数据。
CREATE OR REPLACE TABLE temp_table AS ( SELECT l_shipmode, l_linenumber, l_orderkey FROM aws_dataset.lineitem WHERE l_shipmode IN ('AIR', 'REG AIR') AND l_commitdate < l_receiptdate AND l_shipdate < l_commitdate AND l_receiptdate >= DATE '1997-01-01' AND l_receiptdate < DATE '1997-02-01' );
临时表创建后,JOIN
操作会完成,并运行以下查询:
SELECT l_shipmode, o_orderpriority, count(l_linenumber) AS num_lineitems FROM bigquery_dataset.orders JOIN temp_table ON orders.o_orderkey = lineitem.l_orderkey GROUP BY l_shipmode, o_orderpriority ORDER BY l_shipmode, o_orderpriority;
再举一例,请考虑以下跨云联接:
SELECT c_mktsegment, c_name FROM bigquery_dataset.customer WHERE c_mktsegment = 'BUILDING' UNION ALL SELECT c_mktsegment, c_name FROM aws_dataset.customer WHERE c_mktsegment = 'FURNITURE' LIMIT 10;
在此查询中,LIMIT
子句不会被下推到 BigQuery Omni 区域。FURNITURE
市场细分中的所有客户先转移到 BigQuery 区域,然后才应用 10 个的限制。
连接器
您可以使用 BigQuery 连接器从其他数据处理工具访问基于 BigLake 表的数据。例如,您可以从 Apache Spark、Apache Hive、TensorFlow、Trino 或 Presto 访问 BigLake 表中的数据。针对 BigLake 表的所有数据访问(包括通过连接器进行的数据访问),BigQuery Storage API 会强制执行行级和列级治理政策。
例如,下图演示了 BigQuery Storage API 如何允许用户使用开源查询引擎(如 Apache Spark)访问授权数据:
如需详细了解 BigQuery 支持的连接器,请参阅 BigQuery 连接器。
对象存储中的 BigLake 表
BigLake 允许数据湖管理员设置表(而非文件)的访问权限控制,因此在设置对数据湖中数据的用户访问权限时,您可以使用更精细的选项。
由于 BigLake 表以这种方式简化了访问权限控制,我们建议您使用 BigLake 表来构建和维护与外部对象存储区的连接。
如果不需要治理,或者如果具有数据发现和操纵临时性质,则可以使用外部表。
限制
- 所有外部表限制均适用于 BigLake 表。
- 对象存储中的 BigLake 表受到与 BigQuery 表相同的限制。如需了解详情,请参阅配额。
BigLake 不支持 Dataproc 个人集群身份验证中具有缩小的权限范围的凭据。如需解决此问题,要将集群与个人集群身份验证结合使用,您必须使用带有
--access-boundary=<(echo -n "{}")
标志的空凭据访问边界注入您的凭据。例如,以下命令为名为mycluster
的集群启用名为myproject
的项目中的凭据传播会话:gcloud dataproc clusters enable-personal-auth-session \ --region=us \ --project=myproject \ --access-boundary=<(echo -n "{}") \ mycluster
BigLake 表为只读表。您不能使用 DML 语句或其他方法修改 BigLake 表。
BigLake 表支持以下格式:
- Avro
- CSV
- Delta Lake
- Iceberg
- JSON
- ORC
- Parquet
您无法将缓存的元数据与 Apache Iceberg BigLake 表搭配使用;BigQuery 已在使用 Iceberg 在清单文件中捕获的元数据。
BigQuery Storage API 在其他云环境(如 AWS 和 Azure)中不可用。
如果使用缓存的元数据,则存在以下限制:
- 您只能将缓存的元数据用于使用 Avro、ORC、Parquet、JSON 和 CSV 格式的 BigLake 表。
- 如果您在 Amazon S3 中创建、更新或删除文件,则查询文件在下一次刷新元数据缓存之前不会返回更新后的数据。这可能会导致意外结果。 例如,如果您删除文件并写入新文件,则查询结果可能会同时排除旧文件和新文件,具体取决于所缓存元数据的上次更新时间。
- 引用 Amazon S3 或 Blob Storage 数据的 BigLake 表不支持将客户管理的加密密钥 (CMEK) 与所缓存元数据搭配使用。
安全模型
管理和使用 BigLake 表通常涉及以下组织角色:
- 数据湖管理员。这些管理员通常负责管理针对 Cloud Storage 存储桶和对象的 Identity and Access Management (IAM) 政策。
- 数据仓库管理员。这些管理员通常负责创建、删除和更新表。
- 数据分析师。分析师通常读取数据和运行查询。
数据湖管理员负责创建连接并与数据仓库管理员共享连接。而数据仓库管理员可以创建表、设置适当的访问控制,以及与数据分析师共享表。
启用元数据缓存以提高性能
您可以使用缓存的元数据来提高某些类型的 BigLake 表的查询性能。如果您要处理大量文件,或者数据是 Hive 分区,则元数据缓存特别有用。以下类型的 BigLake 表支持元数据缓存:
- Amazon S3 BigLake 表
- Cloud Storage BigLake 表
如果您未启用元数据缓存,则针对表的查询必须读取外部数据源以获取对象元数据,这会增加查询延迟时间;列出来自外部数据源的数百万个文件可能需要几分钟的时间。如果启用了元数据缓存,查询可以避免列出外部数据源中的文件,从而加快分区和文件删减速度。
有两个属性可以控制此功能:
- 最大过时,控制查询使用缓存元数据的时间。
- 元数据缓存模式,控制元数据的收集方式。
启用元数据缓存后,您需要指定对表执行的操作可以接受的元数据过时的最大间隔时间。例如,当指定间隔时间为 1 小时的时候,如果缓存的元数据在过去 1 小时内刷新,针对表的操作会使用缓存的元数据。如果缓存的元数据早于该值,操作会回退到从数据存储区(Amazon S3 或 Cloud Storage)检索元数据。您可以指定从 30 分钟到 7 天的过时间隔时间。
您可以选择自动或手动刷新缓存:
- 对于自动刷新,缓存会按系统定义的间隔时间刷新,间隔时间通常为 30 到 60 分钟。如果数据存储区中的文件添加、删除或修改的间隔时间是随机的,则自动刷新缓存是一种很好的方法。如果您需要控制刷新的时间(例如在提取-转换-加载作业结束时触发刷新),请使用手动刷新。
对于手动刷新,您需要运行
BQ.REFRESH_EXTERNAL_METADATA_CACHE
系统过程,以按符合要求的时间表刷新元数据缓存。如果想要有选择地刷新元数据,您可以提供表数据目录的子目录,以避免不必要的元数据处理。如果数据存储区中的文件添加、删除或修改的间隔时间是已知的(例如作为流水线的输出),则手动刷新缓存是一种很好的方法。如果您发出多个并发手动刷新,则只有一个刷新会成功。
如果元数据缓存在 7 天内没有刷新,则会失效。
在设置过时间隔时间和元数据缓存模式值之前,您应该考虑它们的交互方式。请参考以下示例:
- 如果您要手动刷新表的元数据缓存并将过时间隔时间设置为 2 天,那么如果希望针对该表的操作使用缓存的元数据,您必须每 2 天(或更短时间)运行一次
BQ.REFRESH_EXTERNAL_METADATA_CACHE
系统过程。 - 如果您要自动刷新表的元数据缓存并将过时间隔时间设置为 30 分钟,那么如果缓存刷新的间隔时间较长(通常为 30 到 60 分钟),则针对该表的某些操作可能会从数据存储区读取。
如需查找元数据刷新作业的相关信息,请查询 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;
对于基于 Parquet 文件的 Cloud Storage BigLake 表,系统会在元数据缓存刷新期间收集表统计信息,并将其用于改进查询计划。
如需了解详情,请参阅元数据缓存。
如需详细了解如何设置元数据缓存选项,请参阅创建 Amazon S3 BigLake 表或创建 Cloud Storage BigLake 表。
具有具体化视图的启用缓存的表
在查询存储在 Cloud Storage 或 Amazon Simple Storage Service (Amazon S3)的结构化数据时,您可以启用了 BigLake 元数据缓存的表的具体化视图来提高性能和效率。 这些具体化视图的功能与 BigQuery 管理的存储表的具体化视图一样,包括自动刷新和智能调整的优势。
集成
您可以通过许多其他 BigQuery 功能和 gcloud CLI 服务访问 BigLake 表,包括以下突出显示的服务。
Analytics Hub
BigLake 表与 Analytics Hub 兼容。包含 BigLake 表的数据集可以作为 Analytics Hub 列表发布。Analytics Hub 订阅者可以订阅这些列表,这些列表会在其项目中预配一个只读数据集(也称为关联的数据集)。订阅者可以查询关联的数据集中的所有表,包括所有 BigLake 表。如需了解详情,请参阅订阅列表。
BigQuery ML
您可以使用 BigQuery ML 在 Cloud Storage 中的 BigLake 上训练和运行模型。
Sensitive Data Protection
Sensitive Data Protection 会扫描 BigLake 表,以识别敏感数据并对其进行分类。如果检测到敏感数据,Sensitive Data Protection 去标识化转换可以遮盖、删除或以其他方式混淆处理该等数据。
费用
费用与 BigLake 表的以下方面相关联:
- 查询表。
- 刷新元数据缓存。
如果您具有槽预留,则无需为查询外部表付费。这些查询会使用槽。
下表显示了您的价格模式如何影响这些费用的应用:
按需价格 |
标准版、企业版和企业 Plus 版 |
|
---|---|---|
查询 |
您需要为用户查询处理的字节数付费。 |
具有 QUERY 作业类型的预留分配中的槽会在查询期间使用。 |
手动刷新元数据缓存。 |
您需要为刷新缓存所处理的字节数付费。 |
具有 QUERY 作业类型的预留分配中的槽会在缓存刷新期间使用。 |
自动刷新元数据缓存。 |
您需要为刷新缓存所处理的字节数付费。 |
具有 BACKGROUND 作业类型的预留分配中的槽会在缓存刷新期间使用。如果没有可用的 BACKGROUND 预留来刷新元数据缓存,并且您使用的是企业版或企业 Plus 版,则 BigQuery 会自动改用 QUERY 预留中的槽。 |
后续步骤
- 了解如何将外部表升级到 BigLake 表。
- 了解如何创建 Cloud Storage BigLake 表。
- 了解如何创建 Amazon S3 BigLake 表。
- 了解如何创建 Blob Storage BigLake 表。
- 了解如何使用 Dataplex 创建数据质量检查。