数据倾斜解决方案之使用随机数以及扩容表进行join

当采用随机数和扩容表进行join解决数据倾斜的时候,就代表着,你的之前的数据倾斜的解决方案,都没法使用。
这个方案是没办法彻底解决数据倾斜的,更多的,是一种对数据倾斜的缓解。
原理,其实在和上一个几乎一样的。

步骤:

1、选择一个RDD,要用flatMap,进行扩容,将每条数据,映射为多条数据,每个映射出来的数据,都带了一个n以内的随机数,通常来说,会选择10。

2、将另外一个RDD,做普通的map映射操作,每条数据,都打上一个10以内的随机数。

3、最后,将两个处理后的RDD,进行join操作。

在这里插入图片描述
sample采样倾斜key并单独进行join

将key,从另外一个RDD中过滤出的数据,可能只有一条,或者几条,此时,咱们可以任意进行扩容,扩成1000倍。

将从第一个RDD中拆分出来的那个倾斜key RDD,打上1000以内的一个随机数。

这种情况下,还可以配合上,提升shuffle reduce并行度,join(rdd, 1000)。通常情况下,效果还是非常不错的。

打散成100份,甚至1000份,2000份,去进行join,那么就肯定没有数据倾斜的问题了吧。

局限性:

1、因为你的两个RDD都很大,所以你没有办法去将某一个RDD扩的特别大,一般咱们就是10倍。

2、如果就是10倍的话,那么数据倾斜问题,的确是只能说是缓解和减轻,不能说彻底解决。

### Spark 数据倾斜优化之随机数解决方案 #### 随机数扩容进行 Join 的原理 当面临数据倾斜问题时,一种有效的策略是在 shuffle 前通过向键附随机前缀的方式增记录数量。这使得原本集中在少数分区的数据被重新分配至更多分区中去处理[^3]。 #### 实现方式 具体实现上,在执行 join 操作之前,先给参 join 的两个 RDD 或 DataFrame 添额外字段作为辅助分桶依据。这些新增的列由原始 key 和一定范围内的随机数值组合而成。这样做的目的是让相同 key 的条目不再局限于同一个 partition 内完成计算而是散布开来减少单个 task 负载过重的情况发生。 ```scala val numSalts = 10 // 可根据实际需求调整盐值的数量 import org.apache.spark.sql.functions._ // 对左salt val dfWithSaltLeft = dfLeft.withColumn("salt", (rand() * numSalts).cast("int")) // 对右也做同样操作 val dfWithSaltRight = dfRight.withColumn("salt", lit(0)) // 这里假设只对一边salt,另一边保持不变也可以work // 执行join操作 val joinedDF = dfWithSaltLeft.join(dfWithSaltRight, Seq("id","salt"), "inner").drop("salt") ``` 上述代码片段展示了如何利用 Scala 编程语言在 Apache Spark 上实施基于随机数扩展的方法来应对数据倾斜挑战。 这种方法虽然增了总体数据量但是有效降低了因个别 key 导致的任务失衡现象从而提高了整体作业效率。不过需要注意的是,此法适用于那些确实存在大量重复 key 并因此引发显著倾斜场景的应用案例;而对于本身已经较为均匀分布的数据集来说可能没有必要采用此类手段[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值