如何在Scala中将DataFrame导出为csv?

11

我该如何使用Scala将Spark的DataFrame导出为CSV文件?

4个回答

15

Spark 2+版本中,您可以简单地使用以下内容:

df.write.csv("/your/location/data.csv")
如果您想确保文件不再分区,则可以添加如下.coalesce(1)来完成;
df.coalesce(1).write.csv("/your/location/data.csv")

1
我们可以重命名part_0000文件吗? - Shringa Bais
如果您希望更改文件名,可以使用cp <旧文件路径> <新文件路径>(或者如果文件仍在hdfs中,则使用hdfs dfs -cp <旧文件路径> <新文件路径>)将文件复制到其当前位置,但使用新名称。 - Taylrl
请注意,此操作不会导出标题。 - Prashant Shubham

15
最简单和最好的方法是使用 spark-csv 库。您可以在提供的链接中查看文档,并且 这里 提供了如何从/到 DataFrame 加载和保存数据的 scala 示例。 代码(Spark 1.4+):
dataFrame.write.format("com.databricks.spark.csv").save("myFile.csv")

编辑:

在保存csv数据时,Spark会创建分块文件。如果您想将这些分块文件合并为单个csv文件,请参考以下链接:

将Spark的CSV输出文件夹合并为单个文件


13

上面的解决方案将CSV导出为多个分区。我在这个stackoverflow页面上找到了另一个解决方案,由zero323提供。当您使用coalesce时,它会将数据帧导出为一个单独的CSV文件。

df.coalesce(1)
  .write.format("com.databricks.spark.csv")
  .option("header", "true")
  .save("/your/location/mydata")

这将创建一个名为mydata的目录,在其中你将找到一个包含结果的csv文件。


0

导出并重命名文件的方法:

def export_csv(  
  fileName: String,
  filePath: String
  ) = {

  val filePathDestTemp = filePath + ".dir/"
  val merstageout_df = spark.sql(merstageout)

  merstageout_df
    .coalesce(1)
    .write
    .option("header", "true")
    .mode("overwrite")
    .csv(filePathDestTemp)
  
  val listFiles = dbutils.fs.ls(filePathDestTemp)

  for(subFiles <- listFiles){
      val subFiles_name: String = subFiles.name
      if (subFiles_name.slice(subFiles_name.length() - 4,subFiles_name.length()) == ".csv") {
        dbutils.fs.cp (filePathDestTemp + subFiles_name,  filePath + fileName+ ".csv")
        dbutils.fs.rm(filePathDestTemp, recurse=true)
      }}} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接