Apache Iceberg™ 表¶
Snowflake 的 Apache Iceberg™ 表将典型 Snowflake 表的性能和查询语义与您管理的外部云存储结合在一起。它们非常适合您无法存储在或选择不存储在 Snowflake 中的现有数据湖。
Iceberg 表使用 Apache Iceberg™ (https://iceberg.apache.org/) 开放表格式规范,该规范为以开放格式存储的数据文件提供了一个抽象层,并支持多种功能,例如:
ACID(原子性、一致性、隔离性、持久性)事务
架构演化
隐藏式分区
表快照
Snowflake 支持使用 Apache Parquet™ (https://parquet.apache.org/) 文件格式的 Iceberg 表。
开始使用¶
要开始使用 Iceberg 表,请参阅 教程:创建第一个 Apache Iceberg™ 表。
工作原理¶
本部分提供有关在 Snowflake 中使用 Iceberg 表的特定信息。要详细了解 Iceberg 表格式规范,请参阅官方的 Apache Iceberg 文档 (https://iceberg.apache.org/docs/latest/) 和 Iceberg 表规范 (https://iceberg.apache.org/spec/)。
数据存储¶
Iceberg 表将其数据和元数据文件存储在外部云存储位置(Amazon S3、Google Cloud Storage 或 Azure Storage)。外部存储不是 Snowflake 的一部分。您负责外部云存储位置的所有管理,包括数据保护和恢复的配置。Snowflake 不为 Iceberg 表提供 故障安全 存储。
Snowflake 使用 外部卷 连接到存储位置,Iceberg 表不会产生 Snowflake 存储成本。有关更多信息,请参阅 计费。
要了解有关 Iceberg 表存储的更多信息,请参阅 Apache Iceberg™ 表的存储。
外部卷¶
外部卷是一个命名的账户级 Snowflake 对象,用于将 Snowflake 连接到 Iceberg 表的外部云存储。外部卷存储您的存储位置的身份和访问管理 (IAM) 实体。Snowflake 使用 IAM 实体安全地连接到存储,以访问表数据、Iceberg 元数据以及存储表架构、分区和其他元数据的清单文件。
单个外部卷可以支持一个或多个 Iceberg 表。
要为 Iceberg 表设置外部卷,请参阅 配置外部卷。
目录¶
Iceberg 目录使计算引擎能够管理和加载 Iceberg 表。该目录构成了 Iceberg 表规范 (https://iceberg.apache.org/spec/#overview) 的第一个架构层,并且必须支持:
存储一个或多个 Iceberg 表的当前元数据指针。元数据指针将表名称映射到该表的当前元数据文件的位置。
执行原子操作,以便您可以更新表的当前元数据指针。
要了解有关 Iceberg 目录的更多信息,请参阅 Apache Iceberg 文档 (https://iceberg.apache.org/concepts/catalog/)。
Snowflake 支持不同的 目录选项。例如,您可以使用 Snowflake 作为 Iceberg 目录,或者使用 目录集成 将 Snowflake 连接到外部 Iceberg 目录。
目录集成¶
目录集成是一个命名的、账户级别的 Snowflake 对象,用于存储有关您的表元数据在以下场景中如何组织的信息:
当您不使用 Snowflake 作为 Iceberg 目录 时。例如,如果您的表由 AWS Glue 管理,则需要目录集成。
当您想要与 Snowflake Open Catalog 集成时:
在 Snowflake Open Catalog 中使用 Snowflake 查询 Iceberg 表。
将 Snowflake 管理的 Iceberg 表与 Snowflake Open Catalog 集成,以便第三方计算引擎可以查询该表。
单个目录集成可以支持一个或多个使用相同外部目录的 Iceberg 表。
要设置目录集成,请参阅 配置目录集成。
元数据和快照¶
Iceberg 使用基于快照的查询模型,在该模型中,使用清单文件和元数据文件映射数据文件。快照表示表在某个时间点的状态,用于访问表中数据文件的完整集合。
要了解有关表元数据和 Time Travel 支持的信息,请参阅 Apache Iceberg™ 表的元数据与保留。
跨云/跨区域支持¶
跨云/跨区域支持取决于 Iceberg 表的类型。
表类型 |
跨云/跨区域支持 |
备注 |
---|---|---|
使用有 目录集成 的外部目录的表 |
✔ |
如果外部卷的 活动存储位置 与 Snowflake 账户不在同一个云提供商处或不在同一区域,则适用以下限制:
如果 Snowflake 账户和外部卷位于不同区域,则在您查询表时,外部云存储账户会产生出口费用。 |
使用 Snowflake 作为目录 的表 |
❌ |
外部卷必须使用 活动存储位置,该位置要具有托管 Snowflake 账户的同一云提供商(位于同一区域)。 如果活动位置不在同一区域,则 CREATE ICEBERG TABLE 语句会返回用户错误。 |
计费¶
当您使用 Iceberg 表时,Snowflake 会向您的账户收取虚拟仓库(计算)使用费和云服务费。如果您使用 自动刷新,Snowflake 也会向您的账户收取费用。
Snowflake 不会 向您的账户收取以下费用:
Iceberg 表存储成本。云存储提供商会直接向您收取数据存储使用费。
Iceberg 表使用的活动字节。但是,INFORMATION_SCHEMA.TABLE_STORAGE_METRICS 和 ACCOUNT_USAGE.TABLE_STORAGE_METRICS 视图会显示 Iceberg 表的 ACTIVE_BYTES,以帮助您跟踪表占用的存储空间。要查看示例,请参阅 检索存储指标。
备注
如果 Snowflake 账户和外部卷位于不同区域,则在您查询表时,外部云存储账户会产生出口费用。
目录选项¶
Snowflake 支持以下 Iceberg 目录选项:
使用 Snowflake 作为 Iceberg 目录
使用外部 Iceberg 目录
下表总结了这两种目录选择之间的差异。
读取权限 |
✔ |
✔ |
写入权限 |
✔ |
❌ 为获得 Snowflake 平台支持,可以转换表以使用 Snowflake 作为目录。 |
数据和元数据存储 |
外部卷(云存储) |
外部卷(云存储) |
Snowflake 平台支持 |
✔ |
❌ |
与 Snowflake Open Catalog 集成 |
✔ 您可以将 Snowflake 管理的表与 Open Catalog 同步,以使用其他计算引擎查询表。 |
✔ 您可以使用 Snowflake 查询由 Open Catalog 管理的 Iceberg 表。 |
✔ |
✔ |
使用 Snowflake 作为目录¶
使用 Snowflake 作为 Iceberg 目录(Snowflake 管理的 Iceberg 表)的 Iceberg 表提供完整的 Snowflake 平台支持,以及读写权限。表数据和元数据存储在 Snowflake 使用 外部卷 访问的外部云存储中。Snowflake 处理表的全部生命周期维护工作,例如压缩。
使用外部目录¶
使用外部目录的 Iceberg 表通过只读权限提供有限的 Snowflake 平台支持。对于此表类型,Snowflake 使用 目录集成 来检索有关 Iceberg 元数据和架构的信息。
您可以使用该选项为以下来源创建 Iceberg 表:
AWS Glue Data Catalog
对象存储中的 Iceberg 元数据文件
对象存储中的 Delta 表文件
Open Catalog
远程 Iceberg REST 目录
Snowflake 不承担表的任何生命周期管理工作。
表数据和元数据存储在 Snowflake 使用 外部卷 访问的外部云存储中。
下图显示了 Iceberg 表如何使用与外部 Iceberg 目录的目录集成。
注意事项和限制¶
以下注意事项和限制适用于 Iceberg 表,并且可能会发生变更:
云和区域
Iceberg 表适用于所有 Snowflake 账户、所有云平台和除中国区域以外的所有区域。
使用外部目录时,支持跨云/跨区域表。有关更多信息,请参阅 跨云/跨区域支持。
Iceberg
支持 Apache Iceberg 规范的版本 1 和 2,但以下 功能 (https://iceberg.apache.org/spec/) 除外:
利用
bucket
转换函数进行的 Iceberg 分区会影响使用条件子句筛选结果的查询的性能。对于不由 Snowflake 管理的 Iceberg 表,请注意以下几点:
只要在快照过期之前定期刷新表,就支持恢复到在创建表后生成的任何快照。
不支持转换带有非物化标识分区列的表。当表使用 Parquet 文件中不存在的源列定义身份转换时,将创建非物化身份分区列。
文件格式
Iceberg 表支持 Apache Parquet 文件。
不支持使用无符号整型逻辑类型的 Parquet 文件。
外部卷
不得使用存储集成访问外部卷中的云存储位置。
必须为创建的每个外部卷配置单独的信任关系。
您可以使用 出站专用连接 访问由 Snowflake 管理的 Iceberg 表和使用目录集成进行对象存储的 Iceberg 表,但不能用于访问使用其他目录集成的 Iceberg 表。
元数据文件
元数据文件无法识别 Iceberg 表的最新快照。
无法使用 ALTER ICEBERG TABLE 命令修改数据文件或快照的位置。要修改这些设置中的任一个,必须使用 CREATE OR REPLACE ICEBERG TABLE 语法重新创建表。
使用外部目录的表:
确保清单文件不包含重复内容。如果在 相同 的快照中存在重复文件,Snowflake 会返回一个包含重复文件路径的错误。
如果 Parquet 元数据包含无效的 UTF-8 字符,则无法创建表。确保 Parquet 元数据符合 UTF-8 标准。
Snowflake 可检测在 Snowflake 外生成的 Parquet 元数据中的损坏和不一致,并通过错误消息突显问题。
即使表元数据不一致,也可以创建、刷新或查询外部管理(或转换)的表。写入 Iceberg 表数据时,确保表元数据统计信息(如
RowCount
或NullCount
)与数据内容相匹配。对于使用 Snowflake 作为目录的表,Snowflake 会单独处理 DDL 语句,且生成元数据的方式可能与其他目录不同。有关更多信息,请参阅 DDL 语句。
群集
群集 支持取决于 Iceberg 表的类型。
表类型
备注
使用 Snowflake 作为 Iceberg 目录的表
使用 CREATE ICEBERG TABLE 或者 ALTER ICEBERG TABLE 命令设置群集密钥。要设置或管理群集密钥,请参阅 CREATE ICEBERG TABLE(使用 Snowflake 作为 Iceberg 目录) 和 ALTER ICEBERG TABLE。
使用外部目录的表
不支持群集。
转换的表
仅当转换表后创建了文件,或者之后使用 DML 语句修改了文件,Snowflake 才会群集文件。
Delta
从带有分区列的 Delta 表文件创建的 Iceberg 表不支持 Snowflake 流。不过,从 无 分区列的 Delta 文件创建的表支持仅插入流。
从 Delta 表文件创建的 Iceberg 表不支持动态表。
Snowflake 不支持从 AWS Glue Data Catalog 中的 Delta 表定义创建 Iceberg 表。
不支持使用以下任何功能或数据类型的 Parquet 文件(Delta 表的数据文件):
字段 IDs。
INTERVAL 数据类型。
精度高于 38 的 DECIMAL 数据类型。
LIST 或 MAP 类型的一级或两级表示。
无符号整型 (INT(signed = false))。
FLOAT16 数据类型。
有关 Delta 数据类型和 Iceberg 表的更多信息,请参阅 Delta 数据类型。
CREATE 和 ALTER 期间的刷新操作 ...REFRESH 每次操作最多可处理 1,000 个 Delta 提交文件。
备注
Snowflake 在创建 Iceberg 表时使用 Delta 检查点文件。1,000 个提交文件限制只适用于最近一次检查点之后的提交。
不支持使用 SYSTEM$GET_ICEBERG_TABLE_INFORMATION 函数生成 Iceberg 元数据。
目前不支持以下 Delta Lake 功能:行跟踪、删除矢量文件、更改数据文件、更改元数据、DataChange、CDC、协议演进。
自动刷新
启用自动刷新后,您无法手动刷新表元数据。要执行手动刷新,请先 关闭自动刷新。
对于在 Snowflake 8.22 版之前创建的目录集成,必须先手动设置
REFRESH_INTERVAL_SECONDS
参数,然后才能对依赖于该目录集成的表启用自动刷新。有关说明,请参阅 ALTER CATALOG INTEGRATION ...。确保新表快照是当前表快照的直接子级。否则,自动刷新将进入
STOPPED
状态。要在发生这种情况时恢复自动刷新,请参阅 错误恢复。
如果您的表为空,请在启用自动刷新 之前 执行手动刷新,以避免未定义的行为。
当您将 目录集成用于对象存储 时,不支持自动刷新。
目前不支持没有序列号列的 Iceberg 版本 1 清单。
第三方客户端对 Iceberg 数据、元数据的访问
第三方客户端无法向使用 Snowflake 作为目录的 Iceberg 表追加、删除或者更新或插入数据。
兼容 S3 的存储
使用与 S3 兼容的存储的 Iceberg 表是 跨区域表,并且不支持以下操作:
将 Snowflake 作为 Iceberg 目录 或将表转换为使用 Snowflake 作为 Iceberg 目录。
使用 SYSTEM$GET_ICEBERG_TABLE_INFORMATION 函数获取有关最新刷新快照的信息。
不支持的功能
所有 Iceberg 表目前不支持以下 Snowflake 功能:
下列驱动程序:
启用 Cross-Cloud Auto-Fulfillment 的列表。
复制 Iceberg 表、外部卷或目录集成。
Snowflake 加密
使用 :doc:/sql-reference/stored-procedures/associate_semantic_category_tags` 存储过程标记 </user-guide/object-tagging>`
使用外部目录 的 Iceberg 表不支持以下功能: