web-dev-qa-db-ja.com

SparkでCSVに書き込む方法

私はSpark Jobをcsvファイルとして保存する効果的な方法を見つけようとしています。HadoopなどでSparkすべてのファイルはpart-00000として保存されます。

spark指定したファイル名でファイルに保存する方法はありますか?

33
Karusmeister

SparkはHadoop File System APIを使用してデータをファイルに書き込むため、これはやむを得ないことです。

rdd.saveAsTextFile("foo")

保存しようとしているRDD内のパーティションごとに1つのpart- *ファイルとともに「foo/part-XXXXX」として保存されます。 RDDの各パーティションが個別のファイルに書き込まれる理由は、フォールトトレランスのためです。 3番目のパーティション(つまりpart-00002)に書き込むタスクが失敗した場合、Spark=タスクを再実行し、部分的に書き込まれた/破損したpart-00002を上書きします。他の部分:すべてが同じファイルに書き込んだ場合、単一のタスクを障害から回復するのははるかに困難です。

part-XXXXXファイルは、Spark/Hadoopベースのフレームワークですべて使用する場合、通常は問題ありません。なぜなら、それらはすべてHDFS APIを使用するため、読み取りを要求する場合「foo」、すべてfoo内のすべてのpart-XXXXXファイルも読み取ります。

52
Tathagata Das

この方法で行うことをお勧めします(Javaの例):

theRddToPrint.coalesce(1, true).saveAsTextFile(textFileName);
FileSystem fs = anyUtilClass.getHadoopFileSystem(rootFolder);
FileUtil.copyMerge(
    fs, new Path(textFileName),
    fs, new Path(textFileNameDestiny),
    true, fs.getConf(), null);
10
adoalonso

Hadoop FileSystem opsに基づく another アプローチがあります。

3
pls

アイデアはありますが、準備ができていないコードスニペットです。内部的に(名前のとおり)SparkはHadoop出力形式を使用します(HDFSから読み取る場合はInputFormatと同様)。

HadoopのFileOutputFormatには保護されたメンバーsetOutputFormatがあり、継承されたクラスから呼び出して他のベース名を設定できます。

1
David Gruzman

拡張 Tathagata Das Spark 2.xおよびScala 2.11への回答

Spark SQLを使用すると、1つのライナーでこれを実行できます

//implicits for magic functions like .toDf
import spark.implicits._

val df = Seq(
  ("first", 2.0),
  ("choose", 7.0),
  ("test", 1.5)
).toDF("name", "vals")

//write DataFrame/DataSet to external storage
df.write
  .format("csv")
  .save("csv/file/location")

その後、あなたは頭に行き、 adoalonso の答えに進むことができます。

1
mrsrinivas

それは本当にきれいな解決策ではありませんが、foreachRDD()の中では基本的にあなたが好きなことをすることができ、新しいファイルを作成することもできます。

私のソリューションでは、これが私がすることです:出力をHDFSに保存し(フォールトトレランスの理由のため)、foreachRDD内で、ローカルフォルダーに統計を含むTSVファイルも作成します。

それがあなたが必要とするものであるならば、おそらくあなたは同じことをすることができると思います。

http://spark.Apache.org/docs/0.9.1/streaming-programming-guide.html#output-operations

0
gprivitera