Lanson

V1

2022/06/20阅读:14主题:兰青

数据湖(九):Iceberg特点详述和数据类型

​ Iceberg特点详述和数据类型

一、Iceberg特点详述

1、Iceberg分区与隐藏分区(Hidden Partition)

Iceberg支持分区来加快数据查询。在Iceberg中设置分区后,可以在写入数据时将相似的行分组,在查询时加快查询速度。Iceberg中可以按照年、月、日和小时粒度划分时间戳组织分区。

在Hive中也支持分区,但是要想使分区能加快查询速度,需要在写SQL时指定对应的分区条件过滤数据,在Iceberg中写SQL查询时不需要再SQL中特别指定分区过滤条件,Iceberg会自动分区,过滤掉不需要的数据。

在Iceberg中分区信息可以被隐藏起来,Iceberg的分区字段可以通过一个字段计算出来,在建表或者修改分区策略之后,新的数据会自动计算所属于的分区,在查询的时候同样不用关心表的分区是什么字段,只需要关注业务逻辑,Iceberg会自动过滤不需要的分区数据。

正是由于Iceberg的分区信息和表数据存储目录是独立的,使得Iceberg的表分区可以被修改,而且不会涉及到数据迁移。

2、​​​​​​​Iceberg表演化(Table Evolution)

在Hive分区表中,如果把一个按照天分区的表改成按小时分区,那么没有办法在原有表上进行修改,需要创建一个按照小时分区的表,然后把数据加载到此表中。

Iceberg支持就地表演化,可以通过SQL的方式进行表级别模式演进,例如:更改表分区布局。Iceberg进行以上操作时,代价极低,不存在读出数据重新写入或者迁移数据这种费时费力的操作。

3、​​​​​​​​​​​​​​模式演化(Schema Evolution)

Iceberg支持以下几种Schema的演化:

  • ADD:向表或者嵌套结构增加新列。
  • Drop:从表或嵌套结构中移除列。
  • Rename:重命名表中或者嵌套结构中的列。
  • Update:将复杂结构(Struct、Map<Key,Value>,list)中的基本类型扩展类型长度,比如:tinyint修改成int。
  • Reorder:改变列的顺序,也可以改变嵌套结构中字段的排序顺序。

注意:

Iceberg Schema的改变只是元数据的操作改变,不会涉及到重写数据文件。Map结构类型不支持Add和Drop字段。

Iceberg保证Schema演化是没有副作用的独立操作,不会涉及到重写数据文件,具体如下:

  • 增加列时不会从另一个列中读取已存在的数据
  • 删除列或者嵌套结构中的字段时,不会改变任何其他列的值。
  • 更新列或者嵌套结构中字段时,不会改变任何其他列的值。
  • 改变列或者嵌套结构中字段顺序的时候,不会改变相关联的值。

Iceberg实现以上的原因使用唯一的id来追踪表中的每一列,当添加一个列时,会分配新的ID,因此列对应的数据不会被错误使用。

4、分区演化(partition Evolution)

Iceberg分区可以在现有表中更新,因为Iceberg查询流程并不和分区信息直接关联。

当我们改变一个表的分区策略时, 对应修改分区之前的数据不会改变, 依然会采用老的分区策略, 新的数据会采用新的分区策略, 也就是说同一个表会有两种分区策略, 旧数据采用旧分区策略, 新数据采用新新分区策略, 在元数据里两个分区策略相互独立,不重合.

因此,在我们写SQL进行数据查询时, 如果存在跨分区策略的情况, 则会解析成两个不同执行计划, 如Iceberg官网提供图所示:

图中booking_table表2008年按月分区, 进入2009年后改为按天分区, 这两中分区策略共存于该表中。得益于Iceberg的隐藏分区(Hidden Partition), 针对上图中的SQL查询, 不需要在SQL中特别指定分区过滤条件(是按照月还是按照天), Iceberg会自动分区, 过滤掉不需要的数据。

5、​​​​​​​​​​​​​​列顺序演化(Sort Order Evolution)

Iceberg可以在一个已经存在的表上修改排序策略。修改了排序策略之后, 旧数据依旧采用老排序策略不变。往Iceberg里写数据的计算引擎总是会选择最新的排序策略, 但是当排序的代价极其高昂的时候, 就不进行排序了。

二、Iceberg数据类型

Iceberg表支持以下数据类型:

类型 描述 注意点
boolean 布尔类型,true或者false
int 32位有符号整形 可以转换成long类型
long 64位有符号整形
float 单精度浮点型 可以转换成double类型
double 双精度浮点型
decimal(P,S) decimal(P,S) P代表精度,决定总位数,S代表规模,决定小数位数。P必须小于等于38。
date 日期,不含时间和时区
time 时间,不含日期和时区 以微秒存储,1000微秒 = 1毫秒
timestamp 不含时区的timestamp 以微秒存储,1000微秒 = 1毫秒
timestamptz 含时区的timestamp 以微秒存储,1000微秒 = 1毫秒
string 任意长度的字符串类型 UTF-8编码
fixed(L) 长度为L的固定长度字节数组
binary 任意长度的字节数组
struct<...> 任意数据类型组成的一个结构化字段
list 任意数据类型组成的List
map<K,V> 任意类型组成的K,V的Map

分类:

后端

标签:

大数据

作者介绍

Lanson
V1

CSDN大数据领域博客专家