Apache Iceberg™ 表:对 Apache Iceberg™ v3 的支持(预览版

此预览版引入了对 Apache Iceberg™ 规范 v3 的支持,但有一些注意事项和限制。除非另有说明,否则此预览版支持 Snowflake 管理的 Iceberg 表和外部管理的 Iceberg 表。

支持的 Iceberg v3 功能

本部分列出了此预览版支持的 Iceberg v3 功能。

数据类型

公共预览版支持以下 v3 数据类型:

  • geography

  • geometry

  • nanosecond

  • variant

有关更多信息,请参阅 Iceberg v3 数据类型

默认值

请参阅 默认值

删除向量

请参阅 删除向量

行沿袭

请参阅 行沿袭

配置默认 Iceberg 版本

Iceberg 表本质上具有它们遵循的格式版本。对于标准 Snowflake 数据库中外部管理的 Iceberg 表,Snowflake 会从表的元数据中检索此版本。

对于以下 Iceberg 表,表所有者必须指定表应遵循的 Iceberg 版本:

Snowflake 中的系统默认 Iceberg 格式版本是 v2,但您可以根据需要将其设置为 v3。要将 Iceberg 版本设置为 v3,请执行以下某项操作:

  • 使用 ICEBERG_VERSION_DEFAULT 参数,在账户、数据库或架构级别将 Iceberg 版本设置为 3。有关更多信息,请参阅 ICEBERG_VERSION_DEFAULT

  • 在您的 CREATE ICEBERG TABLE 语句中指定 ICEBERG_VERSION = 3

    备注

    如果您在创建 Iceberg 表时未指定 Iceberg 版本,则默认情况下,该表是为架构、数据库或账户设置的 Iceberg 版本。架构优先于数据库,数据库优先于账户。

小心

在使用其他引擎将表属性中的 Iceberg 表格式版本升级到 v3 之前,请确保尚不支持 v3 的引擎或应用程序未使用该表。Apache Iceberg 规范不支持将格式版本降级。因此,所有读取器和写入器都必须支持 v3。Snowflake 中 Iceberg 表的默认版本是 v2,可根据需要配置为 v3。目前不支持使用 Snowflake 执行就地版本升级。

使用说明

  • 要修改账户级别的 ICEBERG_VERSION_DEFAULT 参数,您必须是账户管理员;也就是说,您必须是具有 ACCOUNTADMIN 角色的用户。

  • 要修改数据库或架构级别的 ICEBERG_VERSION_DEFAULT 参数,用于执行此操作的角色必须具有相应数据库或架构的 OWNERSHIP 权限。

示例

指定在 my_db 数据库中创建新的 Iceberg 表应使用 v3:

ALTER DATABASE my_db SET ICEBERG_VERSION_DEFAULT=3;
Copy

使用 v3 创建一个新的外部管理的 Iceberg 表。命令中包含的列定义指示将在远程目录中创建新表或替换现有表。该表已成功创建,因为这是一个没有现有版本的新表。

CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table (
    boolean_col boolean,
    int_col int,
    long_col long,
  )
  CATALOG='my_catalog_integration'
  ICEBERG_VERSION=3;
Copy

使用 v3,利用包含 Iceberg 元数据的现有表创建外部管理的 Iceberg 表。此示例缺少列定义或格式版本,表明该表已存在,并且将通过远程目录中的 Iceberg 元数据中推断其列规范和格式版本。此示例使用 目录分发的凭据,因此从 CREATE ICEBERG TABLE 语句中排除了 EXTERNAL_VOLUME 参数:

CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table
  CATALOG = 'my_catalog_integration'
  CATALOG_TABLE_NAME = 'my_table'
  AUTO_REFRESH = TRUE;
Copy

备注

您不能使用 ALTER ICEBERG TABLE 命令更改现有表的格式版本。

获取 Iceberg 表的格式版本

  • 以下示例演示如何获取特定表的 Iceberg 版本:

    SHOW PARAMETERS LIKE 'ICEBERG_VERSION' IN TABLE my_v3_iceberg_table;
    
    Copy

    输出:

    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | key             | value | default | level | description                                       | type   |
    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | ICEBERG_VERSION | 3     | 2       | TABLE | Specifies the Iceberg table format version to ... | NUMBER |
    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    
  • 以下示例演示如何使用 GET_DDL 函数获取特定表的 Iceberg 版本,以检索 Iceberg 表定义:

    SELECT GET_DDL('ICEBERG_TABLE', 'my_v3_iceberg_table');
    
    Copy

    输出:

     CREATE ICEBERG TABLE my_v3_iceberg_table (
      record VARIANT,
      event_timestamp TIMESTAMP_LTZ(6)
    )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'my_external_volume'
      BASE_LOCATION = 'my_iceberg_table'
      ICEBERG_VERSION = 3;
    

Iceberg v3 功能注意事项和限制

使用 Iceberg v3 功能时,请注意以下信息:

不支持的 Snowflake 功能

此 Iceberg v3 预览版不支持以下 Snowflake 功能:

  • 外部管理的 Iceberg 表上的仅追加流

  • Snowflake 上的 dbt 项目

  • 架构推理

  • Snowpipe Streaming classic architecture

  • SnowGov 区域

  • 对于使用外部目录的表,您无法创建具有结构化类型列的 Iceberg v3 表,这些结构化类型包括 OBJECT、ARRAY 或 MAP。例如,您不能使用 CREATE ICEBERGTABLE … ASSELECT (CTAS) 创建具有结构化类型列的外部管理的 Iceberg v3 表。

    您可以使用结构化类型列创建 Snowflake 管理的 Iceberg v3 表。

  • 将 Snowflake 管理的 Iceberg 表从 v2 就地升级到 v3,其中包括克隆 v2 表,然后将克隆升级到 v3

    重要

    如果使用 Apache Spark 将外部管理的 Iceberg 表从 v2 升级到 v3,则必须使用创建新快照的提交,例如 DML 操作。否则,如果在没有新快照的情况下更新表属性中的格式版本,则在创建新快照之前,Snowflake 对表的手动和自动刷新将失败。

    以下示例使用 Apache Spark 将外部管理的 Iceberg 表从 v2 升级到 v3:

    ALTER TABLE table_name SET TBLPROPERTIES('format-version'='3');
    
    Copy

备注

  • 不支持的功能列表尚未最终确定,将来可能会发生变化。该列表将根据需要进行更新,以反映最新的不受支持功能。

  • 有关特定于 v3 功能的注意事项和限制,请参阅功能 专题

支持的 Snowflake 功能

支持未在 :ref:`不支持的 Snowflake 功能 <label-tables_iceberg_v3_unsupported_features>`部分列出的功能。支持的功能包括以下列表中的功能:

功能

备注

列表自动履行

自动刷新

目录集成

目录链接数据库

克隆

群集

仅限 Snowflake 管理的 Iceberg v3。

将外部管理的 v3 表转换为 Snowflake 管理的表

在以下情况下受支持:

  • 转换 v3 Iceberg 表时,Iceberg 分区保持不变。

  • 转换前,Snowflake 绝不会从外部存储中删除任何元数据、清单列表或清单。

  • 转换期间,Snowflake 不会重写任何元数据或 Parquet 数据文件。

  • 转换后,Snowflake 是完全负责表生命周期管理的目录。在转换之前或之后创建的元数据、清单列表、清单和数据文件过期并超过保留窗口后,Snowflake 会从外部存储中删除这些内容。

COPY INTO <table>

LOAD_MODE = FULL_INGEST 或 ADD_FILES COPY 在以下情况下受支持:

  • 要加载 Parquet 文件中的行沿袭元数据列(_row_id`和:code:`_last_updated_sequence_number),您必须使用 FULL_INGEST 选项。不支持使用其他 LOAD_MODE 方法。但是,包含行沿袭的 Parquet 文件可能已经是 Iceberg v3 表的一部分。如果这些文件已经是另一个 Iceberg 表的一部分,不建议使用 ADD_FILES_COPY 注册 Parquet 文件。在不重写文件的情况下,将外部管理的 Iceberg 表转换为 Snowflake 管理的 Iceberg 表的最佳实践是使用 ALTER ICEBERG TABLE ...CONVERT TO MANAGED 命令。

COPY INTO <location>

支持,但有以下限制:

  • VARIANT、GEOMETRY 和 GEOGRAPHY 卸载为 JSON 编码的字符串。

  • TIMESTAMP_NTZ(9) 以毫秒(而非纳秒)为单位卸载。

  • TIMESTAMP_LTZ(9)、ARRAY、OBJECT 和 MAP 必须转换为其他数据类型。

Data Clean Room

数据沿袭

数据保护策略

支持以下数据保护策略:

  • 掩码策略

  • 行访问策略

  • 投影策略

  • 聚合策略

  • 隐私策略

  • 联接策略

通过 Apache Spark 执行数据保护策略

数据质量监控

Dynamic tables

将 v3 外部管理的 Iceberg 表作为动态表的目标写入。

Horizon Iceberg REST 目录 API

LOB(大型对象)

物化视图

Object Tagging

查询加速

复制

搜索优化

安全视图

敏感数据分类

目标文件大小

单实参 Iceberg 分区

分区表也不能写入删除向量;分区表仅支持写入时复制。

Snowflake Connector for Kafka

版本 4.0 或更高版本。

Snowpark

1.33.0 或更高版本。

Snowpark Pandas API 方法 to_iceberg

仅在以下情况下支持 Iceberg v3:ICEBERG_VERSION_DEFAULT 在账户、数据库或架构上设置。如果在表级别设置 ICEBERG_VERSION = 3,则不支持 Snowpark Pandas API 方法 to_iceberg。

Snowpark Connect for Apache Spark

支持使用追加或覆盖方法将 DataFrame 写入现有 Iceberg v3 表。不支持创建新的 Iceberg v3 表。

Snowpipe

Snowpipe Streaming high-performance architecture

共享

  • Snowflake 管理的 Iceberg v3 表支持仅追加流和标准流。

  • 外部管理的 Iceberg v3 表支持仅插入流和标准流。

    • 要使标准流产生正确的结果,外部引擎必须根据 Iceberg v3 规范写入 Iceberg v3 表。具体来说,新插入的行应具有 _row_id=NULL。在写入时复制期间复制的行应保留 _row_id

    • MAX_DATA_EXTENSION_TIME_IN_DAYS 不适用于外部管理的 Iceberg v3 表。

  • 与 Iceberg v2 表相比,当通过多语句事务提交 DMLs 时,Iceberg v3 表上的仅追加流具有不同的语义:

    • 对于 Iceberg v2 上的仅追加流,如果在多语句事务中添加并删除了一行,则该行被视为插入。

    • 而对于 Iceberg v3 上的仅追加流,此行不会被视为插入。

表优化

不支持的 Iceberg v3 功能

不支持 Iceberg v3 规范中的以下功能:

  • 嵌套变体

  • 用于分区和排序的多实参转换

  • 表加密密钥

  • UNKNOWN 数据类型

示例:支持具有现有 Snowflake 功能的 v3

本部分列出了 v3 支持的现有 Snowflake 功能的示例。功能列表包括 Snowflake 管理的表和外部管理的表(如果支持)的示例。

有关此 Iceberg v3 预览版支持的 Snowflake 功能的完整列表,请参阅:ref:支持的 Snowflake 功能<label-iceberg_v3_supported_snowflake_features>

创建 v3 Iceberg 表

以下示例创建一个 Snowflake 管理的 Apache Iceberg™ 表,该表符合 Apache Iceberg™ 规范 v3:

CREATE ICEBERG TABLE my_v3_iceberg_table (
  record VARIANT,
  event_timestamp TIMESTAMP_LTZ(6)
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  ICEBERG_VERSION = 3;
Copy

以下示例创建一个 Apache Iceberg™ 表,该表使用远程 Iceberg REST 目录并符合 Apache Iceberg™ 规范 v3:

备注

您无需使用命令指定 ICEBERG_VERSION = 3,因为格式版本已在外部目录的元数据中定义,因此 Snowflake 会从元数据中检索此版本。

CREATE ICEBERG TABLE my_v3_iceberg_table
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'my_rest_catalog_integration'
  CATALOG_TABLE_NAME = 'my_remote_table'
  AUTO_REFRESH = TRUE;
Copy

以下示例在 目录链接数据库 中创建可写入的 Iceberg 表,该表包含列定义,并符合 Apache Iceberg™ 规范 v3:

USE DATABASE my_catalog_linked_db;

USE SCHEMA 'my_namespace';

CREATE OR REPLACE ICEBERG TABLE my_iceberg_table (
  first_name string,
  last_name string,
  amount int,
  create_date date
)
  ICEBERG_VERSION = 3;
Copy

写入 v3 Iceberg 表

支持 DML 命令 INSERT、UPDATE、DELETE、MERGE、TRUNCATE TABLE 和 COPY INTO,以写入 Snowflake 管理的和 外部管理的 Iceberg v3 表:

以下示例将一行插入 Apache Iceberg™ 表中,该表符合 Apache Iceberg™ 表规范 v3:

INSERT INTO my_v3_iceberg_table (id, payload) VALUES (1, PARSE_JSON('{"name": "Alice", "age": 30}'));
Copy

以下示例将文件加载到 Apache Iceberg™ 表中,该表符合 Apache Iceberg™ 表规范 v3:

COPY INTO my_v3_iceberg_table
  FROM @my_json_stage
  FILE_FORMAT = 'my_json_format'
  MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;
Copy

使用 Snowpipe 加载数据

以下示例从 Iceberg v3 表的文件加载数据,适用于 Snowflake 管理的表和外部管理的表:

CREATE PIPE mypipe
  AUTO_INGEST = TRUE
  INTEGRATION = 'MYINT'
  AS
  COPY INTO snowpipe_db.public.my_v3_iceberg_table
  FROM @snowpipe_db.public.mystage
  FILE_FORMAT = (TYPE = 'JSON');
Copy

备注

Snowflake 支持 Iceberg v3 的其他写入功能。有关此列表,请参阅 Iceberg v3 功能的注意事项和限制,然后查看支持的 Snowflake 功能列表。

创建 v3 动态 Iceberg 表

以下示例以动态表输出的形式写入 v3 Snowflake 管理的 Iceberg 表:

CREATE DYNAMIC ICEBERG TABLE my_dynamic_iceberg_v3_table (
    num_orders NUMBER(10,0),
    order_day
  )
  TARGET_LAG = '20 minutes'
  WAREHOUSE = my_warehouse
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'my_dynamic_iceberg_v3_table'
  ICEBERG_VERSION = 3
  AS
    SELECT
        COUNT(DISTINCT order_id)
        DATE_TRUNC('DAY', order_timestamp_ns) AS order_day
      FROM staging_v3_iceberg_table;
Copy

备注

不支持以动态表目标的形式写入 v2 或 v3 外部管理的 Iceberg 表。动态 Iceberg 表的输出只能由 Snowflake 管理。

查询 v3 Iceberg 表

以下示例查询 Snowflake 管理或外部管理的 Iceberg v3 表:

SELECT * FROM MY_DB.MY_SCHEMA.MY_ICEBERG_V3_TABLE;
Copy