转换 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 分区会被移除。

要求

在转换 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 不允许在源数据类型支持的范围之外插入值。有关更多信息,请参阅 近似类型

语言: 中文