更新时间:2025-12-10 GMT+08:00
分享

Iceberg表支持的数据类型介绍

基本数据类型

Iceberg支持的基本数据类型请参见表1。v1之后添加的基本类型有一个“addedby”版本,是允许使用该类型的第一个规范版本。例如,纳秒精度时间戳是v3规范的一部分;在v1或v2表中使用v3类型可能会破坏前向兼容性。

  • 不含时区的时间戳(Timestamp)值表示一个日期和一天中的时间,与时区无关,时间值独立于时区调整,例如2017-11-16 17:10:34总是被读取为2017-11-16 17:10:34,即具体的时间值(不带时区)。
  • 含时区的时间戳(Timestamptz)值表示时间线上的一个点,值以UTC存储,并且不保留源时区,例如2017-11-16 17:10:34 PST被存储/读取为2017-11-17 01:10:34 UTC,并且这些值被认为是相同的。
  • 字符串必须存储为UTF-8编码的字节数组。
表1 基本数据类型介绍

基本类型

说明

unknown

v3新增的数据类型,当不知道更具体的类型时使用的默认/空列类型。

必须是可选的且具有空默认值,不存储在数据文件中。

boolean

表示真或假。

int

表示32位有符号整数。

可以提升为long类型。

long

表示64位有符号整数。

float

表示32位IEEE 754浮点数。

可以提升为double类型。

double

表示64位IEEE 754浮点数。

decimal(P,S)

定点小数,P表示精度,S表示小数点后的位数。

小数点后的位数是固定的,精度必须小于或等于38。

date

表示日历日期(不含时区或时间)。

time

表示一天中的时间,微秒精度(不含日期、时区)。

timestamp

表示时间戳,微秒精度(不含时区)。

timestamptz

表示时间戳,微秒精度(含时区)。

timestamp_ns

v3新增的数据类型,表示时间戳,纳秒精度(不含时区)。

timestamptz_ns

v3新增的数据类型,表示时间戳,纳秒精度(含时区)。

string

表示任意长度的字符序列,使用UTF-8编码。

uuid

表示通用的唯一标识符,固定长度为16字节。

fixed(L)

表示长度为L的固定长度字节数组。

binary

表示任意长度字节数组。

geometry(C)

v3新增的数据类型,来自OGC简单要素访问的地理空间要素。边缘插值始终是线性/平面的。由坐标参考系CRS C参数化,如果未指定,C为OGC:CRS84。

geography(C, A)

v3新增的数据类型,来自OGC简单要素访问的地理空间要素。由坐标参考系 CRS C和边缘插值算法A参数化;如果未指定,C为 OGC:CRS84,A为spherical(球面)。

嵌套类型

  • Struct:表示一个类型化值的元组。元组中的每个字段都有名称和一个在表模式中唯一的整数ID。每个字段可以为可选或必需,即值是否可以为null。字段可以为任意类型,且可以有一个可选的注释或文档字符串,也可以有默认值。
  • List: 表示具有某种元素类型的值的集合。元素字段有一个在表模式中唯一的整数ID。元素可以为可选或必需,可以为任意类型。
  • Map:表示键值对的集合,具有键类型和值类型。键字段和值字段都有一个在表模式中唯一的整数ID。映射键是必需的,而映射值可以为可选或必需。映射键和映射值可以为任意类型,包括嵌套类型。

半结构化类型

  • Variant: 是一种存储半结构化数据的值。变体中的结构和数据类型在表或数据文件的不同行之间不一定一致。变体类型和二进制编码在Parquet项目中定义,目前支持v1。对Variant的支持在Iceberg v3中添加。
    • 变体类似于JSON,但具有更广泛的基本值集合,包括日期、时间戳、带时区的时间戳、二进制和小数。
    • 变体值可能包含嵌套类型:
      • 数组 (Array): 是变体值的有序集合。
      • 对象 (Object): 是字段的集合,每个字段包含一个字符串键和一个变体值。
    • 作为一种半结构化类型,变体与Iceberg其他数据类型的区别为:
      • 变体数组类似于列表,但可以包含任何变体值,而不是固定的元素类型。
      • 变体对象类似于结构,但可以包含由名称标识的可变字段,并且字段值可以是任何变体值,而不是固定的字段类型。

兼容类型自动转换

Spark和Iceberg各自支持的数据类型范围不同。Iceberg虽然会自动处理类型转换,但不能覆盖所有类型组合,因此在设计表的字段类型之前,需要了解Iceberg的类型转换规则。

  • Spark数据类型转为Iceberg数据类型
    表2 Spark数据类型转为Iceberg数据类型

    Spark数据类型

    Iceberg数据类型

    boolean

    boolean

    short

    integer

    byte

    integer

    integer

    integer

    long

    long

    float

    float

    double

    double

    date

    date

    timestamp(带时区的时间戳)

    timestamp with timezone(带时区的时间戳)

    timestamp_ntz(不带时区的时间戳)

    timestamp_ntz(不带时区的时间戳)

    char

    string

    varchar

    string

    string

    string

    binary

    binary

    decimal

    decimal

    struct

    struct

    array

    list

    map

    map

  • Iceberg数据类型转为Spark数据类型
    表3 Iceberg数据类型转为Spark数据类型

    Iceberg数据类型

    Spark数据类型

    boolean

    boolean

    integer

    integer

    long

    long

    float

    float

    double

    double

    date

    date

    time

    不支持转换

    timestamp with timezone(带时区的时间戳)

    timestamp(带时区的时间戳)

    timestamp_ntz(不带时区的时间戳)

    timestamp_ntz(不带时区的时间戳)

    string

    string

    uuid

    string

    fixed

    binary

    binary

    binary

    decimal

    decimal

    struct

    struct

    list

    array

    map

    map

相关文档