适用于 Apache Iceberg™ 表的 Snowflake Storage

Snowflake 支持适用于 Apache Iceberg™ 表的 Snowflake Storage。

与标准 Snowflake 表类似,此功能允许您在 Snowflake 中创建 Snowflake 管理的 Iceberg 表。通过此选项,Snowflake 会使用 Snowflake(内部)存储为您存储和管理 Iceberg 表文件,因此您无需配置外部云存储的访问权限。

此功能适用于 Snowflake Horizon Catalog,因此您可以使用外部查询引擎连接到使用 Snowflake Storage 的 Iceberg 表。有关更多信息,请参阅 通过 Snowflake Horizon 目录使用外部引擎访问 Apache Iceberg™ 表。此外,您还可以在 Snowflake 中查询这些相同的表。

备注

此功能目前仅适用于托管在 Amazon Web Services (AWS) 或 Azure 上的账户。此功能在政府区域或中华人民共和国境内不可用。

Snowflake Storage 的工作原理

当您使用 Snowflake Storage 创建 Iceberg 表时,Snowflake 会在内部管理所有数据文件和元数据文件。您无需配置外部卷,也无需授予 Snowflake 对云存储的访问权限。

使用 Snowflake Storage 创建 Iceberg 表

CREATE ICEBERG TABLE my_iceberg_table_defaults (col1 int)
  CATALOG = SNOWFLAKE
  EXTERNAL_VOLUME = SNOWFLAKE_MANAGED;

显式指定包含 Snowflake 管理的存储 TRANSIENT 表:

CREATE TRANSIENT ICEBERG TABLE my_iceberg_table_internal (col1 int)
  CATALOG = SNOWFLAKE
  EXTERNAL_VOLUME = SNOWFLAKE_MANAGED;
  • 对于此存储模型,CATALOG 必须为 SNOWFLAKE。如果您的账户默认目录为 Snowflake,则可以省略 CATALOG

  • 使用 Snowflake Storage 时,EXTERNAL_VOLUME 必须为 SNOWFLAKE_MANAGED。如果您的默认外部卷为 SNOWFLAKE_MANAGED,则可以省略 EXTERNAL_VOLUME

SNOWFLAKE_MANAGED 外部卷

EXTERNAL_VOLUME = 'SNOWFLAKE_MANAGED' 为该表选择 Snowflake 提供的存储。SNOWFLAKE_MANAGED 是一个保留值,而不是用户创建的 外部卷 对象。您无需为此路径运行 CREATE EXTERNAL VOLUME

相反,对于将文件存储在 您的 云存储中的 Iceberg 表,您需要创建一个外部卷,授予 USAGE 权限,并将 EXTERNAL_VOLUME 设置为该卷的名称。有关说明,请参阅 配置外部卷

永久表和瞬态表

使用 Snowflake Storage 的 Iceberg 表可以是永久的,也可以是瞬态的:

  • **永久**(默认):表数据受 故障安全 保护,这是 Snowflake 为标准表提供的相同的 7 天数据恢复功能。

  • 瞬态:表数据不受故障安全保护。存储和 Time Travel 行为遵循 Snowflake 中的 瞬态表 规范。瞬态表不会产生故障安全存储成本。

CREATE ICEBERG TABLE 语句中使用 TRANSIENT 关键字可创建瞬态 Iceberg 表。

备注

瞬态 Iceberg 表仅支持使用 Snowflake Storage。您无法创建使用客户管理外部卷的瞬态 Iceberg 表。

小技巧

要检查现有 Iceberg 表是永久的还是瞬态的,请运行 SHOW TABLES 并查看 kind 列。瞬态表的值为 TRANSIENT,永久表的值为 TABLE

默认目录和外部卷

如果您在语句中省略了 CATALOGEXTERNAL_VOLUME,Snowflake 会从架构、数据库和账户默认值中解析它们(优先级为:架构替换数据库,数据库替换账户)。当有效目录为 Snowflake (CATALOG = 'SNOWFLAKE') 时,除非在较低级别设置了不同的默认值,否则默认外部卷为 SNOWFLAKE_MANAGED。有关更多信息,请参阅 在账户、数据库或架构级别设置默认目录 和 。

当您显式设置 CATALOG = 'SNOWFLAKE' 时,默认外部卷为 SNOWFLAKE_MANAGED,除非您使用 EXTERNAL_VOLUME 或指定了另一个卷的架构、数据库或账户默认值将其替换。

复制

您可以使用故障转移组或复制组来复制使用 Snowflake Storage 的 Iceberg 表。要为这些表启用复制,您必须首先按照 为 Snowflake 管理的 Apache Iceberg™ 表配置复制 中的步骤为 Snowflake 管理的 Iceberg 表启用复制。

与标准的 Snowflake 管理的 Iceberg 表不同,您不需要在故障转移或复制组的 OBJECT_TYPES 列表中包含 EXTERNAL VOLUMES。Snowflake 会自动管理使用 SNOWFLAKE_MANAGED 外部卷的复制表的存储。

例如,创建一个故障转移组,用于复制包含使用 Snowflake Storage 的 Iceberg 表的数据库:

CREATE FAILOVER GROUP my_iceberg_fg
  OBJECT_TYPES = DATABASES
  ALLOWED_DATABASES = my_iceberg_database
  ALLOWED_ACCOUNTS = myorg.my_account_1;

复制注意事项

  • 不支持复制到在 Google Cloud Platform (GCP) 上托管的账户。当目标账户托管在 GCP 上时,Snowflake 会在刷新操作期间跳过使用 Snowflake Storage 的 Iceberg 表。

  • 如果您在私密预览版期间使用了 SNOWFLAKE_MANAGED 以外的外部卷创建 Iceberg 表,Snowflake 会自动迁移辅助账户上的复制表以使用 SNOWFLAKE_MANAGED 卷。关于此迁移,请注意以下事项:

    • 如果您在故障转移或复制组的 OBJECT_TYPES 列表中包含 EXTERNAL VOLUMES,则私密预览版的外部卷将复制到辅助账户,但不会附加到表中。辅助账户上对私密预览版外部卷的所有使用都将被阻止。

    • Snowflake 建议您在启用复制之前,先删除任何使用私密预览版外部卷的 Iceberg 表,并使用 EXTERNAL_VOLUME = SNOWFLAKE_MANAGED 重新创建它们。

计费

Snowflake 会根据以下使用情况向您的账户收取费用:

存储成本

  • Snowflake 对存储在 Snowflake 中的每个字节收取费用。

    Snowflake 会在 STORAGE_USAGE 视图STORAGE_BYTES 列中汇总使用 Snowflake Storage 的 Iceberg 表的存储使用情况,以及非 Iceberg 表的存储使用情况。仅提交到目录的文件会包含在 STORAGE_BYTES 中。Snowflake 不会对放弃的提交收取费用。

    此存储使用量的成本在 Snowflake 网站上 Snowflake 服务消耗表 的表 3(a) 中予以说明。

请求成本

备注

每当您通过 Horizon Catalog 使用查询引擎访问存储在 Snowflake 中的 Iceberg 表时,该查询引擎都被视为外部查询引擎。当您使用外部查询引擎访问这些表时,Snowflake 会针对此类访问向您的账户收取费用。

以下列表说明了外部查询引擎访问存储在 Snowflake 中的 Iceberg 表的一些情况:

  • 从另一个 Snowflake 账户通过 Horizon Catalog 访问表的 Snowflake 引擎。例如,如果一个表由 Snowflake 账户 A 管理,但您通过 Horizon Catalog 从账户 B 中的 Snowflake 引擎访问该表,则需要为此访问付费。您需要为此访问付费,因为账户 B 中的 Snowflake 引擎被视为外部查询引擎。

  • 您使用 Snowflake Container Services 在 Snowflake 网络内部署的第三方查询引擎。当您通过 Horizon Catalog 使用这些引擎访问表时,这些引擎属于外部引擎,其请求的计费方式与其他第三方查询引擎相同。

  • 您在 Snowflake 外部部署、并用于通过 Horizon Catalog 连接到表的第三方查询引擎。

当您使用 Snowflake 查询引擎 直接 访问 Iceberg 表时(即不通过 Horizon Catalog 访问),Snowflake 不会向您的账户计费。例如,如果一个表由账户 A 管理,并且您使用账户 A 中的 Snowflake 引擎访问该表,则无需为此访问付费。

  • 当您通过 Snowflake Horizon Catalog 使用外部查询引擎访问使用 Snowflake Storage 的 Iceberg 表时,Snowflake 会针对发送到底层存储系统的每个 HTTP 请求向您的账户收取按次计费的请求费。费率取决于请求类型:

    • PUT、COPY、POST、PATCH 和 LIST 操作,被计费为“第 1 类”。

    • GET 和 SELECT 操作,被计费为“第 2 类”。

    要查看这些操作类型的请求计数,请使用 STORAGE_REQUEST_HISTORY Account Usage 视图。此使用情况在计费报告中的 STORAGE_REQUEST-1STORAGE_REQUEST-2 SKUs 项下计费。

    此费率在 Snowflake 服务使用量表 的表 3(g) 中有所描述。

数据传输成本

  • 当您通过 Horizon Catalog 使用外部查询引擎跨区域或跨云平台访问表时,将按字节收取标准数据传输费用。

    此数据传输费用在 Snowflake 服务使用量表 的表 4(a)、4(b) 和 4(c) 中有所描述。

    有关更多信息,请参阅 了解数据传输成本

专用连接

当您使用外部查询引擎访问使用 Snowflake Storage 的 Iceberg 表时,可以配置专用连接,确保流量不经过公共互联网。

有关设置说明,请参阅 连接到 Snowflake 托管存储卷

注意事项和限制

当您使用利用 Snowflake Storage 的 Iceberg 表时,请考虑以下事项:

备注

当您使用外部查询引擎访问使用 Snowflake 存储的 Iceberg Tables 时,需要考虑一些额外的注意事项。有关更多信息,请参阅 使用外部查询引擎访问 Iceberg 表的注意事项

云提供商支持

此功能目前仅适用于托管在 Amazon Web Services (AWS) 或 Microsoft Azure 上的账户。此功能在政府区域或中华人民共和国境内不可用。

加密

使用 Snowflake Storage 的 Iceberg 表仅支持服务器端加密 (SSE)。即使您的账户启用了 Tri-Secret Secure,也不支持客户管理的密钥 (CMK)。

克隆行为

警告

您创建的 Iceberg 表使用目录分发的凭据。当您克隆使用目录分发的凭据的 Iceberg 表时,克隆表与源表共享相同的基础位置。由于可以使用相同的凭据访问共享的基础位置,因此克隆表对源表具有写访问权限。

对于使用 Snowflake 管理的存储的表 (EXTERNAL_VOLUME = 'SNOWFLAKE_MANAGED'),仅当源表和新表都是瞬态表或都是永久表时,CREATE ICEBERG TABLE ... CLONE 才会成功。如果一个是瞬态的,而另一个是永久的,则该语句将执行失败。

源表

克隆表

结果

瞬态

瞬态

支持

永久

永久

支持

瞬态

永久

不支持

永久

瞬态

不支持

有关命令语法和更多克隆行为,请参阅 CREATE ICEBERG TABLE(使用 Snowflake 作为 Iceberg 目录)克隆和 Apache Iceberg™ 表 中的 CREATE ICEBERG TABLE ... CLONE

引入数据

您可以使用以下方法将数据引入使用 Snowflake Storage 的 Iceberg 表中:

  • Snowpipe:使用 Snowpipe 并通过 COPY INTO 从云存储中的文件加载数据。Snowpipe 同时适用于永久和瞬态 Iceberg 表。

  • Snowpipe Streaming:使用 Snowpipe Streaming 高性能 功能引入流式数据。Snowpipe Streaming 同时适用于永久和瞬态 Iceberg 表。