此时我正在笔记本电脑上使用Spark和Scala。
当我将RDD写入文件时,输出将写入两个文件“part-00000”和“part-00001”。如何强制Spark / Scala 写入一个文件?
我的代码目前是:
myRDD.map(x => x._1 + "," + x._2).saveAsTextFile("/path/to/output")
我removing the parentheses写出关键值对。
答案 0 :(得分:13)
“问题”确实是一个功能,它是由RDD
分区的方式产生的,因此它在n
部分中分开,其中n
是分区数。要解决此问题,您只需使用RDD
上的repartition将分区数更改为一个。文档说明:
重新分区(numPartitions)
返回一个具有完全numPartitions分区的新RDD。
可以增加或减少此RDD中的并行度。在内部,它使用shuffle重新分配数据。如果你是 减少此RDD中的分区数量,请考虑使用 合并,可以避免进行洗牌。
例如,此更改应该有效。
myRDD.map(x => x._1 + "," + x._2).repartition(1).saveAsTextFile("/path/to/output")
正如文档所说,您也可以使用coalesce,这在减少分区数量时实际上是推荐的选项。但是,将分区数量减少到一个被认为是一个坏主意,因为它会导致数据混乱到一个节点并失去并行性。