如何在Spark中写入CSV

Kar*_*ter 33 csv hadoop file distributed-computing apache-spark

我正在尝试找到一种将我的Spark Job的结果保存为csv文件的有效方法.我正在使用Spark和Hadoop,到目前为止我的所有文件都保存为part-00000.

任何想法如何使我的火花保存到具有指定文件名的文件?

Tat*_*Das 53

由于Spark使用Hadoop文件系统API将数据写入文件,因此这是不可避免的.如果你这样做

rdd.saveAsTextFile("foo")
Run Code Online (Sandbox Code Playgroud)

它将保存为" foo/part-XXXXX",并且您要保存的RDD中的每个分区都有一个part-*文件.RDD中每个分区写入单独文件的原因是容错.如果编写第3个分区(即to part-00002)的任务失败,Spark只会重新运行该任务并覆盖部分写入/损坏part-00002,而不会影响其他部分.如果他们都写入同一个文件,那么恢复单个任务的失败要困难得多.

part-XXXXX如果您要在基于Spark/Hadoop的框架中再次使用它们,这些文件通常不会成为问题因为它们都使用HDFS API,如果您要求它们读取"foo",它们都将读取part-XXXXXfoo中的所有文件好.

  • 然后,您可以使用hdfs merge命令将这些包装到一个文件中:`hdfs dfs -getmerge <src-directory> <dst-file>` (12认同)
  • 你也可以检查`coalesce(1)` (8认同)
  • 如果结果数据很小并且单个输出文件很方便,您可以使用`repartition(1)`将数据重新分区为单个输出文件.这应该仅通过小数据来完成,例如,当您想要将CSV移交给分析师以在Excel中查看时. (6认同)
  • 答案@MFARID保存了一个洗牌步骤. (2认同)

小智 10

我建议以这种方式(Java示例):

theRddToPrint.coalesce(1, true).saveAsTextFile(textFileName);
FileSystem fs = anyUtilClass.getHadoopFileSystem(rootFolder);
FileUtil.copyMerge(
    fs, new Path(textFileName),
    fs, new Path(textFileNameDestiny),
    true, fs.getConf(), null);
Run Code Online (Sandbox Code Playgroud)