目录
1. Partitioning分区
分区字段可以来自基础数据类型的字段、struct数据类型的嵌套字段。分区字段的转换函数如下所示:
转换函数名 | 描述 | 原字段数据类型 | 分区字段数据类型 |
---|---|---|---|
identity | 原字段数据值 | 任何基础数据类型 | 和原字段数据类型一样 |
bucket[N] | 对原字段数据值按N取模进行Hash | int, long, decimal, date, time, timestamp, timestamptz, string, uuid, fixed, binary | int |
truncate[W] | 对原字段数据值按宽度W进行截断 | int, long, decimal, string | 和原字段数据类型一样 |
year | 从date或timestamp类型的原字段,解析出year | date, timestamp, timestamptz | int |
month | 从date或timestamp类型的原字段,解析出month | date, timestamp, timestamptz | int |
day | 从date或timestamp类型的原字段,解析出day | date, timestamp, timestamptz | int |
hour | 从timestamp类型的原字段,解析出hour | timestamp, timestamptz | int |
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