假设我有一个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而没有内存错误。
答案 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的文档,了解这种设置文件名的方法