将DataFrame保存为CSV时指定文件名

时间:2017-02-01 21:28:18

标签: scala csv apache-spark pyspark

假设我有一个Spark DF,我想将其保存到磁盘上的CSV文件。在Spark 2.0.0+中,可以将 DataFrame(DataSet[Rows]) 转换为 DataFrameWriter 并使用 .csv 写文件的方法。

该功能定义为

def csv(path: String): Unit
    path : the location/folder name and not the file name.

Spark将csv文件存储在指定位置,通过创建名称为 - part - * .csv。的CSV文件指定。

有没有办法用指定的文件名而不是部分保存CSV - * .csv?或者可以指定前缀而不是part-r?

代码:

df.coalesce(1).write.csv("sample_path")

当前输出:

sample_path
|
+-- part-r-00000.csv

期望输出:

sample_path
|
+-- my_file.csv

注意: coalesce函数用于输出单个文件,执行程序有足够的内存来收集DF而没有内存错误。

1 个答案:

答案 0 :(得分:20)

不可能直接在Spark的char* start = (char*)&toWrite; int pi = sizeof(toWrite); for (; pi > 0; pi--, start++) if (*start) break; out.write(start, pi);

中进行此操作

Spark使用Hadoop文件格式,这需要对数据进行分区 - 这就是您拥有save文件的原因。您可以在处理后轻松更改文件名,就像在this问题

中一样

在Scala中,它看起来像:

part-

或只是:

import org.apache.hadoop.fs._;
val fs = FileSystem.get(sc.hadoopConfiguration);
val file = fs.globStatus(new Path("path/file.csv/part*"))(0).getPath().getName();

fs.rename(new Path("csvDirectory/" + file), new Path("mydata.csv"));
fs.delete(new Path("mydata.csv-temp"), true);

编辑:如评论中所述,您也可以编写自己的OutputFormat,请参阅information的文档,了解这种设置文件名的方法