转换 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';
Copy

接下来,使用 ALTER ICEBERG TABLE ...REFRESH 命令将表元数据与最新元数据文件同步。以下示例命令通过指定元数据文件路径刷新表。

ALTER ICEBERG TABLE myIcebergTable REFRESH 'metadata/v2.metadata.json';
Copy

最后,通过使用 ALTER ICEBERG TABLE ...CONVERT TO MANAGED 命令将表转换为使用 Snowflake 作为 Iceberg 目录。

ALTER ICEBERG TABLE myIcebergTable CONVERT TO MANAGED
  BASE_LOCATION = 'my/relative/path/from/external_volume';
Copy

备注

在此示例中,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 类型写入表数据文件。

对于 intlong 等数据类型,Snowflake 数据类型比 Iceberg 数据类型支持的值范围更大。为了与源数据类型保持一致,Snowflake 不允许在源数据类型支持的范围之外插入值。有关更多信息,请参阅 近似类型

语言: 中文