hudi中zorder采样分区流程分析——《DEEPNOVA开发者社区》

本文详细介绍了Hudi如何利用ZOrder对数据进行重排,特别是针对用户指定字段生成Z值的过程。文章重点讲解了采样分区的流程,包括蓄水池采样方法和确定分区边界的算法,旨在优化数据分布并提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:吴文池

背景

hudi在数据聚集方面,支持使用zorder对数据进行重排。

做zorder排序主要流程分为三步:

-对于用户指定的每个zorder字段,生成对应的z值。
-把所有zorder字段生成的z值进行比特位的交叉组值,生成最终的z值。
-根据最终z值,对所有数据进行排序。

在上面第一步中,每个字段生成自己的z值方式主要有两种:

-直接的值映射方式。该方式实现简单,容易理解,但也有缺陷:
参与生成z值的字段理论上需要是从0开始的正整数,这样才能生成很好的z曲线,但真实的数据集中基本不可能出现,那么zorder的效果将会打折扣。
对于一些前缀相同的数据,例如url字段大多数都以:http://www.开头,那么取前面几位做排序将毫无意义。
-先对数据采样,根据采样数据对所有数据进行分区,最后使用该数据所对应的分区号作为该数据的z值。这种方式可以很好的解决方式一的两个问题:
分区一定是从0开始的整数。
对于前缀相同的数据,也能够根据字符串大小,将其很好的分配到不同分区中,得到不同的z值。
下面主要介绍第二种方式采样分区流程。

(代码以hudi的master分支、commit 22c45a7704cf4d5ec6fb56ee7cc1bf17d826315d 为准)

采样分区流程
整体流程图
(采样分区总体流程图,里面一些详细的计算流程分析可参考下面代码分析)
在这里插入图片描述
代码分析

  1. 获取采样结果
    // 该函数主要对rdd进行采样,并返回采样结果(采样结果包含采样的数据和该数据对应的权重)
    def getRangeBounds(): ArrayBuffer[(K, Float)] = {

// zEncodeNum:即目的分区个数,用户可配置,配置项为:hoodie.layout.optimize.build.curve.sample.size
// 默认分区个数为200000
if (zEncodeNum <= 1) {
ArrayBuffer.empty[(K, Float)]
} else {

// samplePointsPerPartitionHint:每个分区采样个数,默认为20
// sampleSize:需要采样的个数,最多为1e6个
val sampleSize = math.min(samplePointsPerPartitionHint.toDouble * zEncodeNum, 1e6)

// rdd.partitions:rdd的分区个数
// 这里假设每个分区的数据都比较平衡,且每个分区的数据量都比较多,
// 所以多采集一些(因为实际上会出现分区不
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值