适用于 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。

默认目录和外部卷

如果您在语句中省略了 CATALOG 和 EXTERNAL_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-1 和 STORAGE_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 表。