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,那么有什么方法可以将三个输入文件保存到输出文件?
拥有多个输出文件是 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)
注意:此代码效率也极低,并且仅适用于小文件!您需要想出更好的代码。我不会尝试减少文件数量,而是处理多个输出文件。
归档时间: |
|
查看次数: |
14540 次 |
最近记录: |