您当前的位置: 首页 >  ar

Bulut0907

暂无认证

  • 1浏览

    0关注

    346博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

Bulut0907 发布时间:2022-04-28 15:30:32 ,浏览量:1

目录
  • 1. Partitioning分区
    • 1.1 Bucket分桶转换函数的细节
    • 1.2 Truncate截断转换函数的细节
    • 1.3 Partition Evolution分区更新
  • 2. Sorting排序

1. Partitioning分区

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

转换函数名描述原字段数据类型分区字段数据类型identity原字段数据值任何基础数据类型和原字段数据类型一样bucket[N]对原字段数据值按N取模进行Hashint, long, decimal, date, time, timestamp, timestamptz, string, uuid, fixed, binaryinttruncate[W]对原字段数据值按宽度W进行截断int, long, decimal, string和原字段数据类型一样year从date或timestamp类型的原字段,解析出yeardate, timestamp, timestamptzintmonth从date或timestamp类型的原字段,解析出monthdate, timestamp, timestamptzintday从date或timestamp类型的原字段,解析出daydate, timestamp, timestamptzinthour从timestamp类型的原字段,解析出hourtimestamp, timestamptzintvoid生成分区字段的结果值为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 → -10long宽度W截断函数:v - (v % W),结果值为正数W=10: 1 → 0, -1 → -10decimal宽度W截断函数:取小数部分的值,进行v - (v % W)计算,然后替换小数部分的值W=50: 10.65 → 10.50string长度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

关注
打赏
1664501120
查看更多评论
立即登录/注册

微信扫码登录

0.0384s