【问题标题】:saveAsTextFile method in sparkspark中的saveAsTextFile方法
【发布时间】:2015-01-03 01:41:35
【问题描述】:

在我的项目中,我有三个输入文件并将文件名设置为 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))

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

【问题讨论】:

  • 这是您的完整程序吗?看起来不错,您应该在输出目录中有一个文件part-00000_SUCCESS。请注意,saveAsTextFile 的参数实际上是一个目录名称,用于保存输出。
  • 非常感谢您的回复!事实上,我对日志做了一些操作。刚才试了一下,发现很有用,可能是我的项目出了点问题,我去看看!
  • 我自己也试过了,结果只有一个输出。你是在本地运行 Spark 还是在集群中运行?

标签: scala apache-spark


【解决方案1】:

拥有多个输出文件是 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")

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

【讨论】:

    【解决方案2】:

    如前所述,您的问题通过标准 API 在某种程度上是不可避免的,因为假设您正在处理大量数据。但是,如果我假设您的数据是可管理的,您可以尝试以下方法

    import java.nio.file.{Paths, Files}    
    import java.nio.charset.StandardCharsets
    
    Files.write(Paths.get("./test_file"), data.collect.mkString("\n").getBytes(StandardCharsets.UTF_8))
    

    我在这里所做的是通过执行收集然后 mkString 将 RDD 转换为字符串。我建议不要在生产中这样做。它适用于本地数据分析(使用 5gb~ 的本地数据)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2016-09-18
      • 1970-01-01
      • 2016-02-13
      相关资源
      最近更新 更多