C/C++教程

SparkCore中的Key-Value 类型 RDD 的数据分区器

本文主要是介绍SparkCore中的Key-Value 类型 RDD 的数据分区器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.1 HashPartitioner

HashPartitioner分区的原理:对于给定的key,计算其hashCode,并除以分区的个数取余,如果余数小于 0,则用余数+分区的个数(否则加0),最后返回的值就是这个key所属的分区ID。

1.2 RangePartitioner

HashPartitioner 分区弊端: 可能导致每个分区中数据量的不均匀,极端情况下会导致某些分区拥有 RDD 的全部数据。比如我们前面的例子就是一个极端, 他们都进入了 0 分区.

RangePartitioner 作用:将一定范围内的数映射到某一个分区内,尽量保证每个分区中数据量的均匀,而且分区与分区之间是有序的,一个分区中的元素肯定都是比另一个分区内的元素小或者大,但是分区内的元素是不能保证顺序的。简单的说就是将一定范围内的数映射到某一个分区内。实现过程为:

第一步:先从整个 RDD 中抽取出样本数据,将样本数据排序,计算出每个分区的最大 key 值,形成一个Array[KEY]类型的数组变量 rangeBounds;(边界数组).

第二步:判断key在rangeBounds中所处的范围,给出该key值在下一个RDD中的分区id下标;该分区器要求 RDD 中的 KEY 类型必须是可以排序的.

比如[1,100,200,300,400],然后对比传进来的key,返回对应的分区id。

1.3 自定义分区器

要实现自定义的分区器,你需要继承 org.apache.spark.Partitioner, 并且需要实现下面的方法:

 

这篇关于SparkCore中的Key-Value 类型 RDD 的数据分区器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!