scala - spark中的saveAsTextFile方法

标签 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)))

我对日志不做任何处理,但使用以下命令将其保存为文本文件
log.coalesce(1, true).saveAsTextFile(args(args.size - 1))

但它仍然以part-00000、part-00001、part-00002保存到3个文件,那么有什么办法可以将三个输入文件保存到输出文件中?

最佳答案

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

如何在 Hadoop 中“解决”它:
merge output files after reduce phase

如何在 Spark 中“解决”:
how to make saveAsTextFile NOT split output into multiple file?

你也可以在这里获得一个很好的信息:
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")

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

关于scala - spark中的saveAsTextFile方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27718325/

相关文章:

regex - 获取 Scala 2.7.7 中 Regex.MatchIterator 的大小?

scala - 获取Option值或抛出异常

scala - 如何从 Scala 的标准库继承 Scaladoc?

java - Spark 流 : Different average values returned by PairDStream. 打印

hadoop - 通过 Spark App 在 HDFS 中的不同仓库目录之间保存 Hive 表

java - 我需要一个用于 Java 或 Scala 的(简单)、不可变的 2D vector 库

scala - 似乎无法让Future在Scala中运行回调

apache-spark - 如何在数据库中的模式下创建表

python - 查找 Pyspark 中两个日期之间的周末天数

python - Spark 数据帧随机拆分