管理 Apache Iceberg™ 表¶
在 Snowflake 中管理 Apache Iceberg™ 表:
您还可以将使用外部目录的 Iceberg 表转换为使用 Snowflake 作为 Iceberg 目录的表。要了解更多信息,请参阅 转换 Apache Iceberg™ 表以使用 Snowflake 作为目录。
查询表¶
若要查询 Iceberg 表,用户必须获授予或继承以下权限:
对包含该表的数据库和架构的 USAGE 权限
对表的 SELECT 权限
您可以使用 SELECT 语句查询 Iceberg 表。例如:
SELECT col1, col2 FROM my_iceberg_table;
搭配使用 DML 命令与 Snowflake 管理的表¶
使用 Snowflake 作为目录的 Iceberg 表支持完整 数据操作语言 (DML) 命令,包括以下内容:
备注
Snowflake 管理的表还支持使用 COPY INTO <table> 和 Snowpipe 等功能进行高效的批量加载。有关更多信息,请参阅 将数据加载到 Apache Iceberg™ 表中。
示例:更新表¶
您可以使用 INSERT 和 UPDATE 语句来修改 Snowflake 管理的 Iceberg 表。
下面的示例将一个新值插入到名为 store_sales
的 Iceberg 表中,而且,如果 cola
列的值当前为 -99,则将该列的值更新为 1。
INSERT INTO store_sales VALUES (-99);
UPDATE store_sales
SET cola = 1
WHERE cola = -99;
生成 DML 变更的快照¶
对于使用 Snowflake 作为目录的表,Snowflake 会自动生成 Iceberg 元数据。Snowflake 会将元数据写入到外部卷上名为 metadata
的文件夹,该文件夹位于创建表时 BASE_LOCATION
参数指定的位置。
或者,您可以调用 SYSTEM$GET_ICEBERG_TABLE_INFORMATION 函数为新变更生成 Iceberg 元数据。
对于不受 Snowflake 管理的表,该函数将返回有关最新刷新快照的信息。
例如:
SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('db1.schema1.it1');
输出:
+-----------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_ICEBERG_TABLE_INFORMATION('DB1.SCHEMA1.IT1') |
|-----------------------------------------------------------------------------------------------------------|
| {"metadataLocation":"s3://mybucket/metadata/v1.metadata.json","status":"success"} |
+-----------------------------------------------------------------------------------------------------------+
使用行级删除¶
当您已为更新、删除和合并操作配置了 行级删除 (https://iceberg.apache.org/spec/#row-level-deletes) 时,Snowflake 支持对 外部管理的 Iceberg 表 进行查询。
要配置行级删除,请参阅 Apache Iceberg 文档中的 Write 属性 (https://iceberg.apache.org/docs/latest/configuration/#write-properties)。
写时复制与读时合并¶
Iceberg 提供了两种模式来配置计算引擎如何处理外部管理表的行级操作。Snowflake 支持这两种模式。
下表描述了何时可能需要使用每种模式:
模式 |
描述 |
---|---|
写时复制(默认) |
此模式优先考虑读取时间并影响写入速度。 当执行更新、删除或合并操作时,计算引擎会重写整个受影响的 Parquet 数据文件。这可能会导致写入速度变慢(尤其是在处理大型数据文件时),但不会影响读取时间。 |
读时合并 |
此模式优先考虑写入速度并稍微影响读取时间。 当执行更新、删除或合并操作时,计算引擎会创建一个删除文件,其中仅包含有关已更改行的信息。 当从表中读取时,查询引擎会将删除文件与数据文件合并。合并可能增加读取时间。但是,您可以通过安排定期压缩和表维护来优化读取性能。 |
要了解有关 Iceberg 行级更改的更多信息,请参阅 Apache Iceberg 文档中的 行级删除 (https://iceberg.apache.org/spec/#row-level-deletes)。
注意事项和限制¶
在对外部管理的 Iceberg 表使用行级删除时,请考虑以下事项:
Snowflake 仅支持 位置删除 (https://iceberg.apache.org/spec/#position-delete-files)。
为了在使用行级删除时获得最佳读取性能,请执行定期压缩和表维护以删除旧的删除文件。有关信息,请参阅 维护使用外部目录的表。
使用行级删除时,目前不支持以下功能:
自动刷新
在动态表、动态 Iceberg 表或具有现有位置删除的 Iceberg 表上创建物化视图、搜索优化或流。
动态表
在动态表、动态 Iceberg 表或具有活动的或已删除的物化视图、搜索优化或流的 Iceberg 表上,使用位置删除来刷新 Iceberg 快照。
搜索优化
流
维护使用外部目录的表¶
您可以对使用外部目录的 Iceberg 表执行维护操作。
维护操作包括以下内容:
使快照过期
移除旧的元数据文件
压缩数据文件
重要
为了使您的 Iceberg 表与外部更改保持同步,请务必将您的 Snowflake 刷新计划与表维护保持一致。每次执行维护操作时都应 刷新表。
要了解不受 Snowflake 管理的 Iceberg 表的维护信息,请参阅 Apache Iceberg 文档中的 维护 (https://iceberg.apache.org/docs/latest/maintenance/)。
刷新表元数据¶
当您使用外部 Iceberg 目录时,可以使用 ALTER ICEBERG TABLE ... REFRESH 命令刷新表元数据。刷新表元数据会将元数据与最近的表更改同步。
刷新表的元数据¶
以下示例手动刷新使用外部目录(例如,AWS Glue 或 Delta)的表的元数据。刷新表可使表与远程目录中发生的所有更改保持同步。
使用这种类型的 Iceberg 表时,您不需要在命令中指定元数据文件路径。
ALTER ICEBERG TABLE my_iceberg_table REFRESH;
刷新从 Iceberg 文件创建的表的元数据¶
以下示例手动刷新从外部云存储位置中的 Iceberg 元数据文件 创建的表,并指定元数据文件的相对路径,不带前导正斜杠 (/
)。元数据文件定义刷新后表中的数据。
ALTER ICEBERG TABLE my_iceberg_table REFRESH 'metadata/v1.metadata.json';
检索存储指标¶
Snowflake 不会向您的账户收取 Iceberg 表存储费用。但是,您可以通过 Snowflake Information Schema 或 Account Usage 架构中的 TABLE_STORAGE_METRICS 和 TABLES 视图进行查询,以跟踪 Iceberg 表占用了多少存储空间。
下面的示例查询连接了 ACCOUNT_USAGE.TABLE_STORAGE_METRICS 视图和 ACCOUNT_USAGE.TABLES 视图,并根据 TABLES.IS_ICEBERG 列进行筛选。
SELECT metrics.* FROM
snowflake.account_usage.table_storage_metrics metrics
INNER JOIN snowflake.account_usage.tables tables
ON (
metrics.id = tables.table_id
AND metrics.table_schema_id = tables.table_schema_id
AND metrics.table_catalog_id = tables.table_catalog_id
)
WHERE tables.is_iceberg='YES';