通过修改数据,您可以在湖仓一体运行时目录中更新、删除、合并和截断 Apache Iceberg 表中的记录。
在表上启用 BigQuery DML 后,您可以从 BigQuery 以及 Spark 和 Trino 等开源引擎运行标准 DML 语句,从而在存储在 Cloud Storage 中的单个数据副本上实现完全的写入互操作性。
准备工作
-
启用 BigLake API。
启用 API 所需的角色
如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (
roles/serviceusage.serviceUsageAdmin),该角色包含serviceusage.services.enable权限。了解如何授予角色。 - 使用 Apache Iceberg REST 目录端点设置 Lakehouse 运行时目录。
所需的角色
如需获得修改表中数据所需的权限,请让管理员向您授予项目和存储桶的以下 IAM 角色:
-
以凭据自动售卖模式写入表数据:BigLake Editor (
roles/biglake.editor) - 项目 -
在非凭证自动售卖模式下写入表数据:
- BigLake Editor (
roles/biglake.editor) - 项目 - Storage Object User (
roles/storage.objectUser) - Cloud Storage 存储桶
- BigLake Editor (
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
表格功能和支持
在 Lakehouse 运行时目录中使用表时,了解不同的表类型及其选择加入功能会很有帮助。如需详细了解如何使用 Apache Iceberg 表,请参阅 Apache Iceberg 表概览。
支持的 Iceberg 表
仅支持 Apache Iceberg V2(正式版)和 V3(预览版)表。不支持 Iceberg V1 表。如需升级现有的 V1 表,请参阅将 Iceberg V1 表升级到 V2。
使用表格选项(预览版)
您可以通过配置特定的表属性,选择使用 BigQuery 托管功能,例如 BigQuery 数据操纵语言 (DML) 和自动表管理。这些功能的启用方式因表格的创建位置而异:
- 从 BigQuery 迁移:默认启用 BigQuery DML 和自动表管理。
- 从开源引擎:如需选择启用,您必须明确配置表属性。如需了解详情,请参阅配置表格选项。
更新数据
更新表中的现有行:
Spark
ALTER TABLE TABLE_NAME SET TBLPROPERTIES ('gcp.biglake.bigquery-dml.enabled' = true);
UPDATE TABLE_NAME SET data = 'updated row' WHERE id = 1;
Trino
ALTER TABLE TABLE_NAME SET PROPERTIES "gcp.biglake.bigquery-dml.enabled" = 'true';
UPDATE TABLE_NAME SET data = 'updated row' WHERE id = 1;
BigQuery
UPDATE `PROJECT_ID.CATALOG_ID.NAMESPACE.TABLE_NAME`
SET data = "updated row"
WHERE id = 1;
替换以下内容:
PROJECT_ID: Google Cloud项目 ID。CATALOG_ID:您的 Lakehouse 运行时目录 ID。NAMESPACE:您的 Iceberg 命名空间名称。TABLE_NAME:Iceberg 表的名称。
删除数据
从表格中删除特定行:
Spark
ALTER TABLE TABLE_NAME SET TBLPROPERTIES ('gcp.biglake.bigquery-dml.enabled' = true);
DELETE FROM TABLE_NAME WHERE id = 1;
Trino
ALTER TABLE TABLE_NAME SET PROPERTIES "gcp.biglake.bigquery-dml.enabled" = 'true';
DELETE FROM TABLE_NAME WHERE id = 1;
BigQuery
DELETE FROM `PROJECT_ID.CATALOG_ID.NAMESPACE.TABLE_NAME`
WHERE id = 1;
合并数据
将源表中的数据合并到目标 Iceberg 表中:
Spark
ALTER TABLE TARGET_TABLE SET TBLPROPERTIES ('gcp.biglake.bigquery-dml.enabled' = true);
MERGE INTO TARGET_TABLE t
USING SOURCE_TABLE s
ON t.id = s.id
WHEN MATCHED THEN
UPDATE SET t.data = s.data
WHEN NOT MATCHED THEN
INSERT (id, data) VALUES (s.id, s.data);
Trino
ALTER TABLE TARGET_TABLE SET PROPERTIES "gcp.biglake.bigquery-dml.enabled" = 'true';
MERGE INTO TARGET_TABLE t
USING SOURCE_TABLE s
ON t.id = s.id
WHEN MATCHED THEN
UPDATE SET t.data = s.data
WHEN NOT MATCHED THEN
INSERT (id, data) VALUES (s.id, s.data);
BigQuery
MERGE `PROJECT_ID.CATALOG_ID.NAMESPACE.TARGET_TABLE` t
USING `PROJECT_ID.CATALOG_ID.NAMESPACE.SOURCE_TABLE` s
ON t.id = s.id
WHEN MATCHED THEN
UPDATE SET data = s.data
WHEN NOT MATCHED THEN
INSERT (id, data) VALUES (id, data);