转换 Apache Iceberg™ 表以使用 Snowflake 作为目录¶
将 Snowflake 不管理的将 Snowflake 不管理的 Apache Iceberg™ 表 转换为使用 Snowflake 作为 Iceberg 目录的表。
当您需要完整的 Snowflake 平台支持(包括对 Snowflake 目录 SDK 的支持)时,可以选择转换表。
如需了解 Iceberg 表类型之间的差异,请参阅 目录选项。
表转换前后¶
当您将 Iceberg 表转换为使用 Snowflake 作为目录时,该表将变为可写入,并且 Snowflake 将对其进行生命周期管理。
下表比较了转换前后的 Iceberg 表:
转换前 |
转换后 |
|
---|---|---|
Iceberg 目录 |
外部目录(如 AWS Glue),或者根本没有目录。需要目录集成。 |
Snowflake。Snowflake 注册对源数据的更改,并在 Snowflake 目录中注册更改。然后,Snowflake 会更新外部卷上的表元数据。 不需要目录集成。 |
Snowflake 读取操作 |
✔ |
✔ |
Snowflake 写入操作 |
❌ |
✔ |
表数据和元数据的存储位置 |
外部卷(外部云存储)。 |
您指定的基本位置下的外部卷(外部云存储)。 |
数据和元数据清理 |
由您或您的外部目录管理。 |
由 Snowflake 管理。Snowflake 绝不会从外部存储中删除转换之前创建的任何元数据、清单列表或清单。在转换过程中,Snowflake 不会重写任何 Parquet 数据文件。转换表 后,Snowflake 可能会重写一些数据文件,作为定期表维护的一部分。 |
可从 Snowflake 目录 SDK 访问 |
❌ |
✔ |
重要
转换 Iceberg 表时,Snowflake 不会锁定或独占对外部存储的访问权限。要防止表损坏,请确保监控或停止对外部存储位置的任何非 Snowflake 写入(如自动维护作业)。
要求¶
在转换 Iceberg 表之前,请确保 Snowflake 可以写入外部卷。
要使 Snowflake 写入外部卷,必须满足以下条件:
在转换表之前,使用 ALTER ICEBERG TABLE ...REFRESH 命令手动刷新表。
外部卷的
ALLOW_WRITES
属性设置为TRUE
。若要更新现有外部卷的此属性值,请使用 ALTER EXTERNAL VOLUME 命令。例如:ALTER EXTERNAL VOLUME my_ext_vol SET ALLOW_WRITES=TRUE
。对云存储账户设置的访问控制权限必须允许写入访问。例如,如果您使用为 Amazon S3 配置的外部卷,则您的 IAM 角色必须拥有 S3 位置的
s3:PutObject
权限。
备注
不支持转换带有非物化标识分区列的表。当表使用 Parquet 文件中不存在的源列定义身份转换时,将创建非物化身份分区列。
示例:转换表¶
重要
转换 Iceberg 表时,Snowflake 不会锁定或独占对外部存储的访问权限。要防止表损坏,请确保监控或停止对外部存储位置的任何非 Snowflake 写入(如自动维护作业)。
此示例首先从对象存储中的 Iceberg 文件创建 Iceberg 表。Snowflake 使用 METADATA_FILE_PATH
值在列定义的以下位置查找表元数据:<ext-vol-storage-base-url>/path/to/metadata/v1.metadata.json
。
CREATE ICEBERG TABLE myIcebergTable
EXTERNAL_VOLUME='icebergMetadataVolume'
CATALOG='icebergCatalogInt'
METADATA_FILE_PATH='path/to/metadata/v1.metadata.json';
接下来,使用 ALTER ICEBERG TABLE ...REFRESH 命令将表元数据与最新元数据文件同步。以下示例命令通过指定元数据文件路径刷新表。
ALTER ICEBERG TABLE myIcebergTable REFRESH 'metadata/v2.metadata.json';
最后,通过使用 ALTER ICEBERG TABLE ...CONVERT TO MANAGED 命令将表转换为使用 Snowflake 作为 Iceberg 目录。
ALTER ICEBERG TABLE myIcebergTable CONVERT TO MANAGED
BASE_LOCATION = 'my/relative/path/from/external_volume';
备注
在此示例中,ALTER 语句必须指定 BASE_LOCATION
,因为该表是从对象存储中的 Iceberg 文件创建的,而 BASE_LOCATION
不是原始 CREATE ICEBERG TABLE 语句的一部分。BASE_LOCATION
定义从外部卷到 Snowflake 为转换后的表写入表数据和元数据的目录的相对路径。
否则,如果在原始 CREATE ICEBERG TABLE 语句中指定了 BASE_LOCATION
,则不需要将其包含于 ALTER ICEBERG TABLE ...CONVERT TO MANAGED 命令。
例如,Snowflake 将表数据写入 <ext-vol-storage-base-url>/myBaseLocation/data/
。
Snowflake 将转换后的表的元数据写入 <ext-vol-storage-base-url>/myBaseLocation/metadata/
。
转换和数据类型¶
备注
您不能转换使用以下 Iceberg 数据类型的表:
uuid
fixed(L)
Snowflake 使用 Snowflake 数据类型处理和返回值,但会将原始 Iceberg 类型写入表数据文件。
对于 int
和 long
等数据类型,Snowflake 数据类型比 Iceberg 数据类型支持的值范围更大。为了与源数据类型保持一致,Snowflake 不允许在源数据类型支持的范围之外插入值。有关更多信息,请参阅 近似类型。