
# Iceberg表支持的数据类型介绍
#### 基本数据类型
Iceberg支持的基本数据类型请参见[表1]。v1之后添加的基本类型有一个"addedby"版本，是允许使用该类型的第一个规范版本。例如，纳秒精度时间戳是v3规范的一部分；在v1或v2表中使用v3类型可能会破坏前向兼容性。
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/caution_3.0-zh-cn.png)
- 不含时区的时间戳（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数据类型
  表2Spark数据类型转为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数据类型
  表3Iceberg数据类型转为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                     |
     
  
 
