spark中的saveAsTextFile方法

kem*_*iya 7 scala apache-spark

在我的项目中,我有三个输入文件,并将文件名称为args(0)到args(2),我也有一个输出文件名为args(3),在源代码中,我使用

val sc = new SparkContext()
var log = sc.textFile(args(0))
for(i <- 1 until args.size - 1) log = log.union(sc.textFile(args(i)))
Run Code Online (Sandbox Code Playgroud)

我对日志没有任何作用,但是使用它将其保存为文本文件

log.coalesce(1, true).saveAsTextFile(args(args.size - 1))
Run Code Online (Sandbox Code Playgroud)

但它仍然保存为3文件作为00000部分,部分00001,部分00002,那么有什么方法可以将三个输入文件保存到输出文件?

xhu*_*dik 2

拥有多个输出文件是 Hadoop 或 Spark 等多机集群的标准行为。输出文件的数量取决于reducer的数量。

如何在 Hadoop 中“解决”它: 在减少阶段后合并输出文件

如何在 Spark 中“解决”: 如何使 saveAsTextFile 不将输出拆分为多个文件?

您还可以在这里获得一个很好的信息: http ://apache-spark-user-list.1001560.n3.nabble.com/How-to-make-Spark-merge-the-output-file-td322.html

所以,你是对的coalesce(1,true)。然而,这是非常低效的。有趣的是(正如 @climbage 在他的评论中提到的)如果您在本地运行代码,它就可以工作。

您可能会尝试先读取文件,然后保存输出。

...
val sc = new SparkContext()
var str = new String("")
for(i <- 0 until args.size - 1){
   val file = sc.textFile(args(i))       
   file.foreach(line => str+= line)
}
//and now you might save the content
str.coalesce(1, true).saveAsTextFile("out")
Run Code Online (Sandbox Code Playgroud)

注意:此代码效率也极低,并且仅适用于小文件!您需要想出更好的代码。我不会尝试减少文件数量,而是处理多个输出文件。