假设我有3个分区的rdd,我做了一个 coalesce(2)
. 我对spark的经验是,它只是将分区合并在一起,而从不将任何现有分区拆分为多个分区
val data = List((1,1),(1,2),(2,2),(2,3),(3,3),(3,4))
val rdd = sc.parallelize(data)
val partitionedRdd = rdd.partitionBy(new org.apache.spark.HashPartitioner(3))
partitionedRdd.saveAsTextFile("testPartition/partitioned")
//$ cat partitioned/part-00000
//(3,3)
//(3,4)
//$ cat partitioned/part-00001
//(1,1)
//(1,2)
//$ cat partitioned/part-00002
//(2,2)
//(2,3)
val coalescedRdd = partitionedRdd.coalesce(2)
coalescedRdd.saveAsTextFile("testPartition/coalesced")
//$ cat coalesced/part-00000
//(3,3)
//(3,4)
//(2,2)
//(2,3)
//$ cat coalesced/part-00001
//(1,1)
//(1,2)
这保证会继续发生吗?或者只是巧合,目前的实现做到了这一点?
1条答案
按热度按时间j2qf4p5b1#
正如您所说的,coalesce将保证在默认情况下只合并/合并分区。合并不会触发洗牌(重新分配),除非您特别设置
shuffle = True
从文档中这将导致一个狭窄的依赖关系,例如,如果您从1000个分区转到100个分区,则不会出现无序排列,而是100个新分区中的每个分区都将声明当前分区中的10个分区。