使用标头和特定文件名将spark数据帧导出到.csv

时间:2018-02-06 21:13:31

标签: python apache-spark pyspark export-to-csv databricks

我正在尝试将数据从spark数据框导出到.csv文件:

df.coalesce(1)\
  .write\
  .format("com.databricks.spark.csv")\
  .option("header", "true")\
  .save(output_path)

正在创建一个文件名" part-r-00001-512872f2-9b51-46c5-b0ee-31d626063571.csv"

我希望文件名是" part-r-00000.csv"或" part-00000.csv"

在AWS S3上创建文件时,我对如何使用os.system命令的限制。

如何在将标题保留在文件中的同时设置文件名?

谢谢!

1 个答案:

答案 0 :(得分:5)

好吧,虽然我的问题得到-3评级,但我在这里发布的解决方案帮我解决了这个问题。我是一名技术人员,总是更多地关注代码/逻辑而不是研究语法。至少对我来说,应该通过一个小的背景来理解这个问题。

来到解决方案:

当我们从spark数据帧创建.csv文件时,

输出文件默认名为part-x-yyyyy,其中:

1)x是“m”或“r”,具体取决于作业是仅作业图还是减少作业 2)yyyyy是mapper或reducer任务号,可以是00000或随机数。

为了重命名输出文件,运行os.system HDFS命令应该这样做。

import os, sys
output_path_stage = //set the source folder path here
output_path  = // set the target folder path here
//creating system command line
cmd2 = "hdfs dfs -mv " + output_path_stage + 'part-*' + '  ' + output_path + 'new_name.csv'
//executing system command
os.system(cmd2)

fyi,如果我们使用rdd.saveAsTextFile选项,则创建的文件没有标头。如果我们使用coalesce(1).write.format("com.databricks.spark.csv").option("header", "true").save(output_path),则使用随机part-x名称创建文件。上面的解决方案将帮助我们创建一个包含标题,分隔符和所需文件名的.csv文件。