2015-06-17 49 views
2

将RDD写入文件之前执行以下转换之间的区别是什么?Apache Spark中的混洗与非混洗聚结

  1. COALESCE(1,随机播放= TRUE)
  2. COALESCE(1,随机播放= FALSE)

代码示例:

val input = sc.textFile(inputFile) 
val filtered = input.filter(doSomeFiltering) 
val mapped = filtered.map(doSomeMapping) 

mapped.coalesce(1, shuffle = true).saveAsTextFile(outputFile) 
vs 
mapped.coalesce(1, shuffle = false).saveAsTextFile(outputFile) 

它是如何与收集比较() ?我完全知道Spark保存方法会将其与HDFS风格的结构一起存储,但我更关注collect()和shuffled/non-shuffle coalesce()的数据分区方面。

回答

3

shuffle = true和shuffle = false在结果输出中不会有任何实际差异,因为它们都会下降到单个分区。但是,如果将其设置为true,则会执行无用的随机播放。随着shuffle = true,输出在分区间均匀分布(如果需要,也可以增加分区数量),但由于您的目标是1分区,因此无论如何,所有内容都以一个分区结尾。

至于比较collect(),所不同的是所有的数据都存储在一个执行器上而不是驱动器上。

+1

我不确定这是否正确。我已经看到了RDD计划结构中输出分区数量的限制,以迫使其他操作也使用较低数量(本例中为1)的分区。这通常不是你想要的。 –