Spark中,repartition
和partitionBy
都是重新分区的算子,其中partitionBy
只能作用于PairRDD
. 但是,当作用于PairRDD
时,repartition
和partitionBy
的行为是不同的。repartition
是把数据随机打散均匀分布于各个Partition;而partitionBy
则在参数中指定了Partitioner(默认HashPartitioner
),将每个(K,V)对按照K根据Partitioner计算得到对应的Partition. 在合适的时候使用partitionBy
可以减少shuffle次数,提高效率。
案例
下面是一个简单的wordcount的例子,输入的序列分为2个分区,希望输出3个分区。
- 使用
repartition
,会产生两次shuffle:repartition
一次,reduceByKey
一次
val rdd = sc.parallelize(List(('a',1), ('a', 2), ('c', 3), ('b', 4), ('c', 5), ('b', 6), ('a', 7)), 2)
val partRdd = rdd.repartition(3)
val reduceRdd = partRdd.reduceBy