Iceberg 表¶
Iceberg 表使用 Apache Iceberg (https://iceberg.apache.org/) 开放表格式规范,该规范为以开放格式存储的数据文件提供了一个抽象层,并支持多种功能,例如:
ACID(原子性、一致性、隔离性、持久性)事务
架构演化
隐藏式分区
表快照
Snowflake 的 Iceberg 表将常规 Snowflake 表的性能和查询语义与您管理的外部云存储结合在一起。它们非常适合您无法存储在或选择不存储在 Snowflake 中的现有数据湖。
Snowflake 支持使用 Apache Parquet (https://parquet.apache.org/) 文件格式的 Iceberg 表。
开始使用¶
要创建 Iceberg 表,首先要 配置外部卷。有关在 Snowflake 中使用 Iceberg 表的简介,请参阅 快速入门:开始使用 Iceberg 表 (https://quickstarts.snowflake.com/guide/getting_started_iceberg_tables/index.html)。
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 表存储的更多信息,请参阅 为 Iceberg 表配置存储。
外部卷¶
外部卷是一个命名的账户级 Snowflake 对象,用于将 Snowflake 连接到 Iceberg 表的外部云存储。外部卷存储存储位置的 Identity and Access Management (IAM) 实体。Snowflake 使用该 IAM 实体安全地连接到存储,以访问表数据、Iceberg 元数据,以及用于存储表架构、分区和其他元数据的清单文件。
单个外部卷可以支持一个或多个 Iceberg 表。
要为 Iceberg 表设置外部卷,请参阅 配置外部卷。
Iceberg 目录¶
Iceberg 目录使计算引擎能够管理和加载 Iceberg 表。该目录构成了 Iceberg 表规范 (https://iceberg.apache.org/spec/#overview) 的第一个架构层,并且必须支持:
存储一个或多个 Iceberg 表的当前元数据指针。元数据指针将表名称映射到该表的当前元数据文件的位置。
执行原子操作,以便您可以更新表的当前元数据指针。
要了解有关 Iceberg 目录的更多信息,请参阅 Apache Iceberg 文档 (https://iceberg.apache.org/concepts/catalog/)。
Snowflake 支持不同的:ref:目录选项<label-tables_iceberg_catalog_options>。例如,您可以使用 Snowflake 作为 Iceberg 目录,或者使用 目录集成 将 Snowflake 连接到外部 Iceberg 目录。
目录集成¶
目录集成是一个命名的账户级 Snowflake 对象,用于存储有关不使用 Snowflake 作为 Iceberg 目录 时表元数据的组织方式的信息。例如,如果表格由 AWS Glue 管理,则需要进行目录集成。
单个目录集成可以支持一个或多个使用相同外部目录的 Iceberg 表。
要设置目录集成,请参阅 为 Iceberg 表配置目录集成。
元数据和快照¶
Iceberg 使用基于快照的查询模型,在该模型中,使用清单文件和元数据文件映射数据文件。快照表示表在某个时间点的状态,用于访问表中数据文件的完整集合。
要了解有关表元数据和 Time Travel 支持的信息,请参阅 管理存储中的文件 和 配置 Time Travel。
跨云/跨区域支持¶
跨云/跨区域支持取决于 Iceberg 表的类型。
表类型 |
跨云/跨区域支持 |
备注 |
---|---|---|
使用 目录集成 的表 |
✔ |
如果外部卷的 活动存储位置 与 Snowflake 账户不在同一个云提供商处或不在同一区域,则适用以下限制:
如果 Snowflake 账户和外部卷位于不同区域,则在您查询表时,外部云存储账户会产生出口费用。 |
使用 Snowflake 作为目录 的表 |
❌ |
外部卷必须使用 活动存储位置,该位置要具有托管 Snowflake 账户的同一云提供商(位于同一区域)。 如果活动位置不在同一区域,则 CREATE ICEBERG TABLE 语句会返回用户错误。 |
计费¶
当您使用 Iceberg 表时,Snowflake 会向您的账户收取虚拟仓库(计算)使用费和云服务费。
Snowflake 不会 向您的账户收取以下费用:
Iceberg 表存储成本。云存储提供商会直接向您收取数据存储使用费。
Iceberg 表使用的活动字节。但是,TABLE_STORAGE_METRICS 视图 会显示 Iceberg 表的 ACTIVE_BYTES,以帮助您跟踪表占用的存储空间。
备注
如果 Snowflake 账户和外部卷位于不同区域,则在您查询表时,外部云存储账户会产生出口费用。
Iceberg 目录选择¶
在 Snowflake 中创建 Iceberg 表时,可以使用 Snowflake 作为 Iceberg 目录,也可以使用 目录集成 来连接外部 Iceberg 目录。
下表总结了这两种目录选择之间的差异。
读取权限 |
✔ |
✔ |
写入权限 |
✔ |
❌ 为了获得完整的平台支持,可以转换表以使用 Snowflake 作为目录。 |
数据和元数据存储 |
外部卷(云存储) |
外部卷(云存储) |
全面支持 Snowflake 平台 |
✔ |
❌ |
✔ |
✔ |
使用 Snowflake 作为 Iceberg 目录¶
使用 Snowflake 作为 Iceberg 目录的 Iceberg 表提供完整的 Snowflake 平台支持,以及读写权限。表数据和元数据存储在 Snowflake 使用 外部卷 访问的外部云存储中。Snowflake 处理表的全部生命周期维护工作,例如压缩。
使用外部目录¶
使用外部目录的 Iceberg 表通过只读权限提供有限的 Snowflake 平台支持。对于此表类型,Snowflake 使用 目录集成 来检索有关 Iceberg 元数据和架构的信息。
您可以使用此选项创建在 AWS Glue 数据目录中注册的 Iceberg 表,或者使用对象存储中的 Iceberg 元数据文件创建表。
Snowflake 不承担表的任何生命周期管理工作。
表数据和元数据存储在 Snowflake 使用 外部卷 访问的外部云存储中。
下图显示了 Iceberg 表如何使用与外部 Iceberg 目录的目录集成。
注意事项和限制¶
以下注意事项和限制适用于 Iceberg 表,并且可能会发生变更:
Iceberg
支持 Apache Iceberg 规范的版本 1 和 2,但以下 功能 (https://iceberg.apache.org/spec/) 除外:
行级删除(位置删除或等值删除)。
使用
history.expire.min-snapshots-to-keep
表属性 (https://iceberg.apache.org/docs/1.2.1/configuration/#table-behavior-properties) 来指定要保留的默认最少快照数量。有关更多信息,请参阅 元数据和快照。利用
bucket
转换函数进行的 Iceberg 分区会影响使用条件子句筛选结果的查询的性能。对于不由 Snowflake 管理的 Iceberg 表,请注意以下几点:
务必使 Snowflake 刷新计划与表维护操作(例如快照到期或压缩)保持一致。每次执行维护操作时都应 刷新表。
只要在快照过期之前定期刷新表,就支持恢复到在创建表后生成的任何快照。
不支持转换带有非物化标识分区列的表。当表使用 Parquet 文件中不存在的源列定义身份转换时,将创建非物化身份分区列。
文件格式
仅支持 Apache Parquet 文件。
不支持使用无符号整型逻辑类型的 Parquet 文件。
外部卷
不得使用存储集成访问外部卷中的云存储位置。
必须为您创建的每个外部卷单独配置信任关系。
元数据文件
元数据文件不能识别 Iceberg 表的最新快照。
无法使用 ALTER ICEBERG TABLE 命令修改数据文件或快照的位置。要修改这些设置中的任一个,必须使用 CREATE OR REPLACE ICEBERG TABLE 语法重新创建表。
Snowflake 功能
Iceberg 表当前不支持以下功能和操作:
Iceberg Tables 不支持表暂存区。
从 Iceberg 表创建一个克隆。此外,数据库和架构的克隆不包含 Iceberg 表。
使用 ASSOCIATE_SEMANTIC_CATEGORY_TAGS 存储过程自动应用 标签。
Snowflake 架构演化。但是,使用 Snowflake 作为目录的 Iceberg 表支持 Iceberg 架构演化 (https://iceberg.apache.org/docs/latest/evolution/)。
备注
在 Snowflake 版本 7.42 之前创建的表不支持 Iceberg 架构演化。
创建临时或瞬态 Iceberg 表。
复制 Iceberg 表、外部卷或目录集成。
在 SnowGov 区域中创建和使用 Iceberg 表。
动态表。
Iceberg 表 支持 查询历史数据。
群集 支持取决于 Iceberg 表的类型。
表类型
备注
使用 Snowflake 作为 Iceberg 目录的表
使用 CREATE ICEBERG TABLE 或者 ALTER ICEBERG TABLE 命令设置群集密钥。要设置或管理群集密钥,请参阅 CREATE ICEBERG TABLE(使用 Snowflake 作为 Iceberg 目录) 和 ALTER ICEBERG TABLE。
使用外部目录的表
不支持群集。
转换的表
仅当转换表后创建了文件,或者之后使用 DML 语句修改了文件,Snowflake 才会群集文件。
第三方客户端对 Iceberg 数据、元数据的访问
第三方客户端无法向使用 Snowflake 作为目录的 Iceberg 表追加、删除或者更新或插入数据。