Iceberg 表数据类型¶
本主题说明数据类型如何用于 Snowflake 中的 Iceberg 表。
Snowflake 支持 `Apache Iceberg 规范<https://iceberg.apache.org/spec/>`_ 定义的大部分数据类型,并会将 Iceberg 数据类型写入表文件,以便在您使用 Snowflake 作为目录时,Iceberg 表在不同的计算引擎之间保持互操作性。
有关 Snowflake 支持的 Iceberg 数据类型的概述,请参阅 Iceberg 表支持的数据类型。
近似类型¶
如果您的表使用的 Iceberg 数据类型不支持 精确匹配 ,Snowflake 会使用 近似 的 Snowflake 类型。此类型映射会影响使用 Snowflake 作为目录的转换表和 Iceberg 表的列值。
例如,考虑一个包含 Iceberg 类型 int
的列的表。Snowflake 使用 Snowflake 数据类型 NUMBER(10,0) 处理列值。
NUMBER(10,0) 的范围为 (-9,999,999,999, +9,999,999,999),但 int
范围更有限,为 (-2,147,483,648, +2,147,483,647)。如果尝试在该列中插入值 3,000,000,000,则 Snowflake 将返回超出范围的错误消息。
有关近似类型的详细信息,请参阅 Iceberg 表支持的数据类型 表中的备注。
Iceberg 表支持的数据类型¶
本节中的表显示了 Iceberg 数据类型和 Snowflake 数据类型之间的关系。它们使用以下列:
- Iceberg 类型:
Apache Iceberg 规范中定义的数据类型。使用 Snowflake 作为目录时,Snowflake 会将 Iceberg 类型写入表数据文件,以便表在不同的计算引擎之间保持互操作性。
- Snowflake 类型:
用于处理和返回表数据的 Snowflake 数据类型。例如,如果架构指定了 Iceberg 类型
timestamp
,则 Snowflake 将使用 Snowflake 数据类型 TIMESTAMP_NTZ(6) 以微秒精度处理并返回值。- 备注:
其他使用说明,包括有关使用 近似类型 的说明。
数值类型¶
使用 Snowflake 作为目录¶
下表显示了对于使用 Snowflake 作为 Iceberg 目录的表(由 Snowflake 管理的表),Iceberg 数值数据类型如何映射到 Snowflake 数值数据类型。当您创建 Snowflake 管理的 Iceberg 表时,可使用 Iceberg 数据类型 (https://iceberg.apache.org/spec/#schemas-and-data-types) 来定义数值列。
Iceberg 数据类型 |
Snowflake 数据类型 |
备注 |
---|---|---|
|
如果插入的 10 位数小于最小值,或大于最大的 32 位带符号整数值,则会导致超出范围错误。 |
|
|
如果插入的 19 位数小于最小值,或大于最大的 64 位带符号整数值,则会导致超出范围错误。 |
|
|
与 Snowflake DOUBLE 数据类型同义。Snowflake 将所有浮点数都视为双精度 64 位浮点数,但会将 Iceberg 浮点数作为 32 位浮点数写入表数据文件。 将转换从 64 位缩窄到 32 位会导致精度损失。 您不能使用 |
|
|
与 Snowflake DOUBLE 数据类型同义。Snowflake 将所有浮点数都视为双精度 64 位浮点数。 将转换从 64 位缩窄到 32 位会导致精度损失。 您不能使用 |
|
|
指定 |
外部目录¶
当您创建使用外部 Iceberg 目录的 Iceberg 表时,Iceberg 数值类型将根据下表映射到 Snowflake 数值类型。
Iceberg 数据类型 |
Snowflake 数据类型 |
---|---|
|
|
|
|
|
|
|
|
|
备注
您不能使用 float
或 double
作为主键(根据 Apache Iceberg 规范 (https://iceberg.apache.org/spec/#identifier-field-ids))。
其他数据类型¶
Iceberg 数据类型 |
Snowflake 数据类型 |
备注 |
---|---|---|
|
||
|
||
|
基于 Apache Iceberg 表规范的微秒级精度。 |
|
|
TIMESTAMP_NTZ (6) 或 TIMESTAMP_LTZ (6),这取决于 Snowflake 参数 TIMESTAMP_TYPE_MAPPING 的值。 |
基于 Apache Iceberg 表规范的微秒级精度。 您还可以使用 Parquet 物理类型 |
|
基于 Apache Iceberg 表规范的微秒级精度。 您还可以使用 Parquet 物理类型 |
|
|
||
|
使用 Snowflake 作为目录的表或转换后的表不支持 使用外部目录或从对象存储中的文件创建表时,Snowflake 会将 |
|
|
您可使用此类型创建 Iceberg 表,但不能转换具有:code:fixed(L) 类型列的表。 |
|
|
结构化类型列最多支持 1000 个子列。 |
|
|
结构化类型列最多支持 1000 个子列。 |
|
|
结构化类型列最多支持 1000 个子列。 |
注意事项¶
使用 Iceberg 表的数据类型时,请注意以下事项:
-
uuid
fixed(L)
对于使用 Snowflake 作为目录的表,不支持创建使用 Iceberg
uuid
数据类型的表。适用于所有 Iceberg 表类型:
结构化类型列最多支持 1000 个子列。
对于时间和时间戳类型,Iceberg 支持微秒精度。因此,您无法在 Snowflake 中创建使用其他精度(如毫秒或纳秒)的 Iceberg 表。
您不能使用
float
或double
作为主键(根据 Apache Iceberg 规范 (https://iceberg.apache.org/spec/#identifier-field-ids))。