使用目录联合查询 BigQuery

Lakehouse 通过一项称为 BigQuery 目录联合的功能提供与 BigQuery 的互操作性。借助此功能,您可以将由 BigQuery 管理的表(例如 Iceberg 管理的表)公开给外部开源 (OSS) 引擎,例如 Apache Spark 和 Trino。

Apache Iceberg REST Catalog 端点不会创建专用的 Lakehouse 目录容器来存储元数据,而是纯粹充当代理网关。当外部引擎使用 bq:// 仓库前缀进行连接时,网关会将目录请求直接路由到 BigQuery 的内部目录。 这样,您就可以使用标准 BigQuery DDL 或 API 直接在 BigQuery 中创建和管理表,同时让外部 OSS 引擎通过 REST Catalog 端点对这些表进行只读查询。

BigQuery 目录联合的工作原理

借助 BigQuery 目录联合,您可以通过 Lakehouse 运行时目录 Apache Iceberg REST Catalog 端点公开 BigQuery 表,例如 Iceberg 管理的表和 BigQuery 元存储表。

BigQuery 目录联合流程的工作原理如下:

  1. 在 BigQuery 目录中创建表:您可以使用 DDL 语句在 BigQuery 中创建 Iceberg 管理的表。此表存在于 BigQuery 目录中,受 BigQuery 访问权限控制列表 (ACL) 的控制,并充当 BigQuery REST 资源。
  2. 从 Lakehouse 运行时目录联合到 BigQuery 仓库:使用 Lakehouse 运行时目录 Apache Iceberg REST API,您可以联合 到由 bq://projects/PROJECT_ID 仓库路径格式(或区域版本 bq://projects/PROJECT_ID/locations/LOCATION)指定的仓库。 这样,您就可以通过 Lakehouse API 从 Apache Spark 等计算引擎 访问 BigQuery 表。在此配置中,您可以通过 Spark 获得只读体验,但可以通过 BigQuery 获得读写体验。

注意事项

  • 由于 BigQuery 目录联合不会创建专用的 Lakehouse 目录资源,因此其他目录级概念和配置(例如资源层次结构、存储桶和目录区域以及四部分 P.C.N.T 命名结构)不适用于此方法。在底层 API 中,这对应于 CATALOG_TYPE_BIGQUERY 配置。请注意,联合 BigQuery 目录不支持存储访问权限委托(凭据自动售卖)。

  • BigQuery 目录联合不同于 无边界 Lakehouse 的跨云数据访问功能。BigQuery 目录联合将 Google Cloud 表公开给外部 OSS 引擎,而 Lakehouse 将 Google Cloud 连接到远程外部目录(例如 Databricks Unity Catalog),以便直接从 BigQuery 和 OSS 引擎查询存储在其他云提供商中的数据,而无需迁移数据。如需详细了解该工作流,请参阅跨云数据访问权限简介

与由 Apache Iceberg REST Catalog 端点管理的表的比较

BigQuery 目录联合与 Lakehouse 运行时目录使用 Apache Iceberg REST Catalog 端点的工作流不同,具体如下:

  • 资源管理和目录存储:联合表作为 BigQuery REST 资源驻留在 BigQuery 目录中,而 Lakehouse 运行时目录充当代理网关。当 Lakehouse 运行时目录使用 Apache Iceberg REST Catalog 端点时,表直接存储在目录中,作为 Lakehouse REST 资源。
  • 访问权限控制:联合表使用 BigQuery IAM 权限和访问控制列表 (ACL)。当 Lakehouse 运行时目录使用 Apache Iceberg REST Catalog 端点时,表使用 Lakehouse ACL。
  • 引擎读写功能:联合表通过 BigQuery 提供读写 访问权限,但外部 引擎(例如 Spark)提供只读访问权限。当 Lakehouse 运行时目录使用 Apache Iceberg REST Catalog 端点时,表支持来自 BigQuery API 和外部引擎(例如 Spark)的读写操作。

准备工作

  1. 验证是否已为您的 Google Cloud 项目启用结算功能。

  2. 启用 BigLake API。

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已通过所有者角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获取此权限。了解如何授予角色

    启用 API

所需的角色

如需获得在 BigQuery 中使用目录联合所需的权限,请让管理员向您授予以下 IAM 角色:

  • 读取目录资源和查询表数据:
  • 使用 BigQuery 目录联合执行数据操纵语言 (DML) 操作:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义 角色或其他预定义 角色来获取所需的权限。

设置 BigQuery 目录联合

如需启用 BigQuery 目录联合,请使用客户端配置示例中的 WAREHOUSE_PATH 字段中的 bq://projects/PROJECT_ID 仓库格式配置客户端(例如 Apache Spark 或 Trino)。

您还可以选择添加 BigQuery 位置,以 使用 bq://projects/PROJECT_ID/locations/LOCATION 格式将未来的请求限制为单个位置。

由于这些资源由 BigQuery 管理,因此您必须拥有 适用的 所需权限

为联合表创建命名空间

为 BigQuery 目录联合配置客户端后,您可以为联合表创建命名空间。

Spark

如需使用 BigQuery 目录联合,请添加 LOCATIONDBPROPERTIES 子句:

spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME LOCATION 'gs://BUCKET_NAME/NAMESPACE_NAME' WITH DBPROPERTIES ('gcp-region' = 'LOCATION');")
spark.sql("USE NAMESPACE_NAME;")

替换以下内容:

  • NAMESPACE_NAME:命名空间的名称。
  • BUCKET_NAME:您与目录搭配使用的 Cloud Storage 存储桶。
  • LOCATION:BigQuery 位置。默认值为 US 多区域。

Trino

如需使用 BigQuery 目录联合,请添加 LOCATIONgcp-region 属性:

CREATE SCHEMA IF NOT EXISTS  CATALOG_NAME.SCHEMA_NAME WITH ( LOCATION = 'gs://BUCKET_NAME/SCHEMA_NAME', "gcp-region" = 'LOCATION');
USE CATALOG_NAME.SCHEMA_NAME;

替换以下内容:

  • CATALOG_NAME:使用 Apache Iceberg REST Catalog 端点的 Trino 目录的名称。
  • SCHEMA_NAME:架构的名称。
  • BUCKET_NAME:您与目录搭配使用的 Cloud Storage 存储桶。
  • LOCATION:BigQuery 位置。默认值为 US 多区域。

在 BigQuery 中查询联合表

您在联合目录中创建的表在 BigQuery 中可见,并且可以使用标准 BigQuery SQL 直接查询(无需四部分 P.C.N.T 名称):

SELECT * FROM `NAMESPACE_NAME.TABLE_NAME`;

替换以下内容:

  • NAMESPACE_NAME:命名空间的名称。
  • TABLE_NAME:表的名称。

后续步骤