spark中有两种分区器:HashPartitioner和RangePartitioner,分别用于根据RDD中key的hashcode值进行分区以及根据范围进行数据分区,默认HashPartitioner。
object PartitionerApp {
def main(args: Array[String]): Unit = {
val sc = ContextUtils.getSparkContext(this.getClass.getSimpleName)
val data = sc.parallelize(List(1,2,3,4,5,6,30,100,300,400,500),3)
data.zipWithIndex()
//.groupByKey()
.sortByKey()
.mapPartitionsWithIndex((index, partition)=>{
partition.map(x=>s"分区是$index, 元素是${x._1}")
}).printInfo()
sc.stop()
}
}
总结:
groupByKey底层采用的分区器是HashPartitioner;
sortByKey底层采用的分区器是RangePartitioner。
分区策略都一样。
分区策略:同Kafka分区策略,每个分区的元素个数算法:如 11 % 3 = 2,余下两个元素分给前两个分区,即第一个分区有4个元素,第二个分区有4个元素,第三个分区有3个元素。