目录
1. Partitioning分区
- 1. Partitioning分区
- 1.1 Bucket分桶转换函数的细节
- 1.2 Truncate截断转换函数的细节
- 1.3 Partition Evolution分区更新
- 2. Sorting排序
分区字段可以来自基础数据类型的字段、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分区转换函数进行替换
- 添加的分区字段,只能添加到最后
未排序,则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