在spark上,合并是重新分配分区还是合并分区?

vh0rcniy  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(427)

假设我有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)

这保证会继续发生吗?或者只是巧合,目前的实现做到了这一点?

j2qf4p5b

j2qf4p5b1#

正如您所说的,coalesce将保证在默认情况下只合并/合并分区。合并不会触发洗牌(重新分配),除非您特别设置 shuffle = True 从文档中
这将导致一个狭窄的依赖关系,例如,如果您从1000个分区转到100个分区,则不会出现无序排列,而是100个新分区中的每个分区都将声明当前分区中的10个分区。

相关问题