创建 Delta Lake BigLake 表

如需注册此预览版,请填写以下表单。 如需针对此功能提交反馈或请求支持,请发送电子邮件至 biglake-help@google.com

BigLake 可让您通过更精细的访问权限控制来访问 Delta Lake 表。Delta Lake 是由 Databricks 开发的开源表格数据存储格式,支持 PB 级数据表。

BigQuery 支持 Delta Lake 表的以下功能:

  • 访问权限委派:使用访问权限委派查询外部数据存储区中的结构化数据。委托访问权限功能将对 Delta Lake 表的访问权限与对底层数据存储区的访问权限分离。
  • 精细的访问权限控制: 在表级层强制执行精细的安全措施,包括行级层列级层安全性。对于基于 Cloud Storage 的 Delta Lake 表,您还可以使用动态数据遮盖
  • 架构演变:系统会自动检测 Delta Lake 表中的架构更改。对架构的更改会反映在 BigQuery 表中。

当您将 Delta Lake 表配置为 BigLake 表时,该表还支持所有 BigLake 功能。

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 启用 BigQuery Connection and BigQuery Reservation API。

    启用 API

  4. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

  5. 确保您拥有 BigQuery 数据集

  6. 确保您的 Google Cloud SDK 为 366.0.0 版或更高版本:

    gcloud version
    

    如有需要,请更新 Google Cloud SDK

  7. 创建基于外部数据源的 Cloud 资源连接,并为该连接授予 Cloud Storage 的访问权限。如果您没有适当的权限来创建连接,请让 BigQuery 管理员创建一个连接并与您共享。

所需的角色

创建 Delta Lake 表需要以下权限:

  • bigquery.tables.create
  • bigquery.connections.delegate

BigQuery Admin (roles/bigquery.admin) 预定义的 Identity and Access Management 角色包含这些权限。

如果您不是此角色的主账号,请让您的管理员授予您这些权限或为您创建 Delta Lake 表。

此外,如需允许 BigQuery 用户查询表,与连接关联的服务账号必须具有以下权限和访问权限:

  • BigQuery Viewer (roles/bigquery.viewer) 角色
  • BigQuery Connection User (roles/bigquery.connectionUser) 角色
  • 访问包含这些数据的 Cloud Storage 存储桶

如需详细了解 BigQuery 中的 Identity and Access Management 角色和权限,请参阅预定义的角色和权限

使用 Delta Lake 创建表

如需创建 Delta Lake 表,请按照以下步骤操作。

SQL

使用 CREATE EXTERNAL TABLE 语句创建 Delta Lake 表:

CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.DELTALAKE_TABLE_NAME`
WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
OPTIONS (
  format ="DELTA_LAKE",
  uris=['DELTA_TABLE_GCS_BASE_PATH']);

替换以下值:

  • PROJECT_ID:您要在其中创建 Delta Lake 表的项目的 ID
  • DATASET:包含 Delta Lake 表的 BigQuery 数据集
  • DELTALAKE_TABLE_NAME:Delta Lake 表的名称
  • REGION:包含用于创建 Delta Lake 表的连接的区域,例如 us
  • CONNECTION_ID:连接 ID,例如 myconnection

    当您在 Google Cloud 控制台中查看连接详情时,连接 ID 是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如 projects/myproject/locations/connection_location/connections/myconnection

  • DELTA_TABLE_GCS_BASE_PATH:Delta Lake 表前缀

bq

在命令行环境中,使用 bq mk 命令创建 Delta Lake 表:

bq mk --table --external_table_definition=DEFINITION_FILE PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

替换以下值:

  • DEFINITION_FILE:表定义文件的路径
  • PROJECT_ID:您要在其中创建 Delta Lake 表的项目的 ID
  • DATASET:包含 Delta Lake 表的 BigQuery 数据集
  • DELTALAKE_TABLE_NAME:Delta Lake 表的名称

REST

使用 BigQuery API 通过调用 tables.insert API 方法创建 Delta Lake 表:

REQUEST='{
  "autodetect": true,
  "externalDataConfiguration": {
  "sourceFormat": "DELTA_LAKE",
  "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
  "sourceUris": [
    "DELTA_TABLE_GCS_BASE_PATH"
  ],
 },
"tableReference": {
"tableId": "DELTALAKE_TABLE_NAME"
}
}'

echo $REQUEST | curl -X POST -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables?autodetect_schema=true

替换以下值:

  • PROJECT_ID:您要在其中创建 Delta Lake 表的项目的 ID
  • REGION:包含用于创建 Delta Lake 表的连接的区域,例如 us
  • CONNECTION_ID:连接 ID,例如 myconnection

    当您在 Google Cloud 控制台中查看连接详情时,连接 ID 是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如 projects/myproject/locations/connection_location/connections/myconnection

  • DELTA_TABLE_GCS_BASE_PATH:Delta Lake 表前缀

  • DELTALAKE_TABLE_NAME:Delta Lake 表的名称

  • DATASET:包含 Delta Lake 表的 BigQuery 数据集

创建 Delta Lake 表时,Delta Lake 前缀将用作表的 URI。例如,对于在存储桶 gs://bucket/warehouse/basictable/_delta_log 中包含日志的表,表 URI 为 gs://bucket/warehouse/basictable。在 Delta Lake 表运行查询时,BigQuery 会读取前缀下的数据以标识表的当前版本,然后计算该表的元数据和文件。

更新 Delta Lake 表

如需更新(刷新)Delta Lake 表的架构,请按照以下步骤操作。

bq

在命令行环境中,使用 bq update 命令更新(刷新)Delta Lake 表的架构:

bq update --autodetect_schema PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

替换以下值:

  • PROJECT_ID:您要在其中创建 Delta Lake 表的项目的 ID
  • DATASET:包含 Delta Lake 表的 BigQuery 数据集
  • DELTALAKE_TABLE_NAME:Delta Lake 表的名称

REST

使用 BigQuery API 通过调用 tables.patch API 方法更新 Delta Lake 表:

REQUEST='{
  "externalDataConfiguration": {
    "sourceFormat": "DELTA_LAKE",
    "sourceUris": [
      "DELTA_TABLE_GCS_BASE_PATH"
    ],
    "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
    "autodetect": true
  },
  "tableReference": {
    "tableId": "DELTALAKE_TABLE_NAME"
  }
}'
echo $REQUEST |curl -X POST -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables

替换以下值:

  • DELTA_TABLE_GCS_BASE_PATH:Delta Lake 表前缀
  • PROJECT_ID:您要在其中创建 Delta Lake 表的项目的 ID
  • REGION:包含用于创建 Delta Lake 表的连接的区域,例如 us
  • CONNECTION_ID:连接 ID,例如 myconnection

    当您在 Google Cloud 控制台中查看连接详情时,连接 ID 是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如 projects/myproject/locations/connection_location/connections/myconnection

  • DELTALAKE_TABLE_NAME:Delta Lake 表的名称

  • DATASET:包含 Delta Lake 表的 BigQuery 数据集

查询 Delta Lake 表

创建 Delta Lake BigLake 表后,您可以使用 GoogleSQL 语法查询表,就像查询标准 BigQuery 表一样。例如:

SELECT field1, field2 FROM mydataset.my_cloud_storage_table;

如需了解详情,请参阅查询 BigLake 表中的 Cloud Storage 数据

与服务账号关联的外部连接用于连接到数据存储区。由于服务账号从数据存储区中检索数据,因此用户只需要访问 Delta Lake 表。

数据映射

BigQuery 会将 Delta Lake 数据类型转换为 BigQuery 数据类型,如下表所示:

Delta Lake 类型 BigQuery 类型
boolean BOOL
byte INT64
int INT64
long INT64
float FLOAT64
double FLOAT64
Decimal(P/S) NUMERICBIG_NUMERIC,具体取决于精度
date DATE
time TIME
timestamp (not partition column) TIMESTAMP
timestamp (partition column) DATETIME
string STRING
binary BYTES
array<Type> ARRAY<Type>
struct STRUCT
map<KeyType, ValueType> ARRAY<Struct<key KeyType, value ValueType>>

限制

Delta Lake 表除了 BigLake 表限制之外,还具有以下限制:

  • 支持具有删除向量和列映射的 Delta Lake 读取器版本 3。
  • 您必须在最后一个日志条目文件中列出读取器版本。例如,新表必须包含 00000..0.json
  • 不支持变更数据捕获 (CDC) 操作。任何现有 CDC 操作都会被忽略。
  • 架构是自动检测的。 不支持使用 BigQuery 修改架构。
  • 表列名称必须遵循 BigQuery 列名称限制
  • 不支持具体化视图。
  • Delta Lake 不支持 Read API。