我制作了需要保存为文本文件(.csv)的RDD。 由于它并行工作,输出文件与工作号码一样多。 我使用" repatition或coalesce"制作RDD后会将输出作为一个文件。
myRDDData.repatition(1).saveAsTextFile(..path)
or
myRDDData.coalesce(1).saveAsTextFile(..path)
效果很好,但使用起来很慢。
我只需要像" cat *>这样的命令输出"在壳中。 对此有何想法?感谢。
答案 0 :(得分:1)
要回答标题中的问题:repartition
和coalesce
速度很慢,因为它们会混乱数据,数据移动速度很慢。 coalesce
通常会更快,因为它只允许减少分区数量,因此Spark不必移动所有数据(它可以保存尽可能多的分区,只需移动剩余的分区) )。
回答你的问题。有几个选择:
1)你正在做的重新分配/合并为1。请注意:请注意不要在此之后创建新的RDD并使用它们,因为这可能会导致问题(流上的RDD也可能只有1个分区)
2)如果结果数据足够小并且驱动程序节点可以在内存中处理它,您可以myRDDData.collect()
然后使用标准Scala / Java API将其保存到文件中
3)执行myRDDData.saveAsTextFile(path)
,然后使用Java / Scala API合并文件,如何执行此操作取决于目标FS,但它们可能会为您提供某种API。例如,在HDFS中,您可以使用FileUtils.copyMerge()