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 表与以下数据存储区搭配使用:

临时表支持

基于 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_xregion_sink_ 前缀的数据集以及这些数据集中的临时表,因此,若要仅授予对由跨云联接创建的资源的访问权限,请针对 TableDataset 资源类型使用 resource.name.startsWith 条件

如需详细了解 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 沙盒不支持跨云联接。
  • 如果查询包含 JOIN 语句,则聚合可能不会下推到 BigQuery Omni 区域。
  • 每个临时表仅用于单个跨云查询,即使同一查询多次重复,也不会重复使用。
  • 每个转移作业的大小上限为 60 GB。具体而言,如果您对 BigLake 表应用过滤条件并加载结果,则其必须小于 60 GB。如果需要,您可以申请提高配额限制。扫描的字节数没有限制。
  • 跨云联接查询对查询速率采用内部配额。如果查询速率超过配额,您可能会收到 All our servers are busy processing data transferred between regions 错误。重试查询在大多数情况下应该都有效。请联系支持团队增加内部配额,以支持更高的查询率。
  • 只有在包含相应 BigQuery Omni 区域的共置 BigQuery 区域以及 USEU 多区域中支持跨云联接。在 USEU 多区域中运行的跨云联接只能分别访问美国或欧盟 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 表的列时,您不能使用 INTERVALRANGE 字面量。
  • 跨云联接作业不会报告处理和从其他云转移的字节数。此信息在跨云查询执行过程中创建的子 CTAS 作业中提供。
  • 只有 BigQuery Omni 区域支持引用 BigQuery Omni 表或视图的已获授权的视图已获授权的例程
  • 如果您的跨云查询引用了 STRUCTJSON 列,则系统不会对任何远程子查询应用任何下推。为了优化性能,不妨考虑在 BigQuery Omni 区域中创建一个视图,用于过滤 STRUCTJSON 列,并仅将必要的字段作为单独的列返回。
  • 跨云联接不支持时间旅行查询

跨云联接示例

以下查询将 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 SparkApache HiveTensorFlowTrinoPresto 访问 BigLake 表中的数据。针对 BigLake 表的所有数据访问(包括通过连接器进行的数据访问),BigQuery Storage API 会强制执行行级和列级治理政策。

例如,下图展示了 BigQuery Storage API 如何允许用户使用开源查询引擎(如 Apache Spark)访问已获得授权的数据:

BigLake 架构。

如需详细了解 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 表支持以下格式:

  • 您无法将缓存的元数据适用于 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 表
元数据包括文件中的文件名、分区信息和物理元数据(例如行数)。您可以选择是否为表启用元数据缓存。包含大量文件和使用 Hive 分区过滤条件的查询从元数据缓存中获益最多。

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

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

  • 最大过时指定查询何时使用缓存的元数据。
  • 元数据缓存模式指定元数据的收集方式。

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

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

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

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

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

手动和自动缓存刷新都会以 INTERACTIVE 查询优先级执行。

如果您选择使用自动刷新,我们建议您创建预留,然后为运行元数据缓存刷新作业的项目创建具有 BACKGROUND 作业类型的分配。这样可以防止刷新作业与用户查询资源争用资源,如果没有足够可用资源,这些作业可能会失败。

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

  • 如果您要手动刷新表的元数据缓存并将过时间隔时间设置为 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 预留中的槽。

您还需要为 Cloud StorageAmazon S3Azure Blob Storage 的存储和数据访问付费,具体费用取决于每种产品的定价指南。

后续步骤