【Iceberg表规范】Partitioning分区和Sorting排序

1. Partitioning分区

分区字段可以来自基础数据类型的字段、struct数据类型的嵌套字段。分区字段的转换函数如下所示:

转换函数名描述原字段数据类型分区字段数据类型
identity原字段数据值任何基础数据类型和原字段数据类型一样
bucket[N]对原字段数据值按N取模进行Hashint, long, decimal, date, time, timestamp, timestamptz, string, uuid, fixed, binaryint
truncate[W]对原字段数据值按宽度W进行截断int, long, decimal, string和原字段数据类型一样
year从date或timestamp类型的原字段,解析出yeardate, timestamp, timestamptzint
month从date或timestamp类型的原字段,解析出monthdate, timestamp, timestamptzint
day从date或timestamp类型的原字段,解析出daydate, timestamp, timestamptzint
hour从timestamp类型的原字段,解析出hourtimestamp, timestamptzint
void生成分区字段的结果值为null任何基础数据类型和原字段数据类型一样

如果原字段的值为null,则分区字段的结果值也是null

1.1 Bucket分桶转换函数的细节

采用32-bit的Murmur3 Hash算法,X86变种,种子数为0。函数伪代码如下:

def bucket_N(x) = (murmur3_x86_32_hash(x) & Integer.MAX_VALUE) % N

其中和Integer.MAX_VALUE进行取位运算,是为了取消正负号符号,让Hash结果值只有正数

1.2 Truncate截断转换函数的细节

字段数据类型截断转换函数参数截断说明例子
int宽度W截断函数:v - (v % W),结果值为正数W=10: 1 → 0, -1 → -10
long宽度W截断函数:v - (v % W),结果值为正数W=10: 1 → 0, -1 → -10
decimal宽度W截断函数:取小数部分的值,进行v - (v % W)计算,然后替换小数部分的值W=50: 10.65 → 10.50
string长度L对字符串从前开始截取长度为L的子字符串L=3: iceberg → ice

1.3 Partition Evolution分区更新

在版本1中,分区字段没有唯一分区字段ID,但是在reference implementation中指定了从1000开始的递增数字ID。这导致一个数字ID可能指向多个分区。对于版本1的partition Evolution有如下约束

  • 不对分区字段进行重排序
  • 不删除分区字段,使用void分区转换函数进行替换
  • 添加的分区字段,只能添加到最后

2. Sorting排序

未排序,则Sort order ID等于0

对于浮点数,排序规则如下:-NaN < -Infinity < -value < -0 < 0 < value < Infinity < NaN

data file或delete file的内部数据排序,是根据manifest file中的Sort order ID进行的。对于默认的Sort order,如果进行排序成本太高,可能不会使用使用此Sort order ID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值