web-dev-qa-db-ja.com

DataFrameをCSVとして保存するときにファイル名を指定する

Spark= DF CSVファイルをディスクに保存したい。InSpark 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ファイルを作成することで指定された場所に保存します。

Part-*。csvの代わりに指定されたファイル名でCSVを保存する方法はありますか?または、part-rの代わりにprefixを指定できますか?

コード:

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

現在の出力:

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

望ましい出力:

sample_path
|
+-- my_file.csv

注:合体機能は単一のファイルを出力するために使用され、エグゼキュータはDFをメモリエラーなしで収集するのに十分なメモリを持っています。

21

Sparkのsaveで直接実行することはできません

SparkはHadoop File Formatを使用しますが、これにはデータのパーティション化が必要です-だからpart-ファイル。 this 質問のように、処理後にファイル名を簡単に変更できます

Scalaでは次のようになります。

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);

あるいは単に:

import org.Apache.hadoop.fs._;
val fs = FileSystem.get(sc.hadoopConfiguration());
fs.rename(new Path("csvDirectory/data.csv/part-0000"), new Path("csvDirectory/newData.csv"));

編集:コメントで述べたように、独自のOutputFormatを作成することもできます。ファイル名を設定するこのアプローチについて information のドキュメントを参照してください

24
T. Gawęda