创建 Delta Lake BigLake 表
借助 BigLake,您可以访问具有更精细访问权限控制的 Delta Lake 表。Delta Lake 是由 Databricks 开发的开源表格数据存储格式,支持 PB 级数据表。
BigQuery 支持 Delta Lake 表的以下功能:
- 访问权限委派:使用访问权限委派查询外部数据存储区中的结构化数据。委托访问权限功能将对 Delta Lake 表的访问权限与对底层数据存储区的访问权限分离。
- 精细的访问权限控制: 在表级层强制执行精细的安全措施,包括行级层和列级层安全性。对于基于 Cloud Storage 的 Delta Lake 表,您还可以使用动态数据遮盖。
- 架构演变:系统会自动检测 Delta Lake 表中的架构更改。对架构的更改会反映在 BigQuery 表中。
当您将 Delta Lake 表配置为 BigLake 表时,该表还支持所有 BigLake 功能。
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery Connection and BigQuery Reservation APIs.
-
In the Google Cloud console, activate Cloud Shell.
确保您拥有 BigQuery 数据集。
确保您的 Google Cloud SDK 为 366.0.0 版或更高版本:
gcloud version
如有需要,请更新 Google Cloud SDK。
创建基于外部数据源的 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) |
NUMERIC 或 BIG_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,其中包含删除向量和列映射。
- 不支持 Delta Lake V2 检查点。
- 您必须在最后一个日志条目文件中列出读取器版本。例如,新表必须包含
00000..0.json
。 - 不支持变更数据捕获 (CDC) 操作。任何现有 CDC 操作都会被忽略。
- 架构是自动检测的。 不支持使用 BigQuery 修改架构。
- 表列名称必须遵循 BigQuery 列名称限制。
- 不支持具体化视图。
- Delta Lake 不支持 Read API。