web-dev-qa-db-ja.com

結果のRDDをcsvファイルにSpark=python

結果のRDD labelsAndPredictions = testData.map(lambda lp: lp.label).Zip(predictions)があります。これは、次の形式で出力されます。

[(0.0, 0.08482142857142858), (0.0, 0.11442786069651742),.....]

私が欲しいのは、labels(上記の出力のタプルの最初の部分)とpredictions(タプルの出力の2番目の部分)に1つの列を持つCSVファイルを作成することです。しかし、Pythonを使用してSparkでCSVファイルに書き込む方法がわかりません。

上記の出力を使用してCSVファイルを作成するにはどうすればよいですか?

21
Jason Donnald

RDDの行(map)を文字列(CSVの行)にlabelsAndPredictionsしてから、rdd.saveAsTextFile()を使用します。

def toCSVLine(data):
  return ','.join(str(d) for d in data)

lines = labelsAndPredictions.map(toCSVLine)
lines.saveAsTextFile('hdfs://my-node:9000/tmp/labels-and-predictions.csv')
33
Daniel Darabos

私はこれが古い投稿であることを知っています。しかし、同じものを検索する人を助けるために、PySpark 1.6.2の単一のCSVファイルに2列のRDDを書き込む方法は次のとおりです

RDD:

>>> rdd.take(5)
[(73342, u'cells'), (62861, u'cell'), (61714, u'studies'), (61377, u'aim'), (60168, u'clinical')]

今のコード:

# First I convert the RDD to dataframe
from pyspark import SparkContext
df = sqlContext.createDataFrame(rdd, ['count', 'Word'])

DF:

>>> df.show()
+-----+-----------+
|count|       Word|
+-----+-----------+
|73342|      cells|
|62861|       cell|
|61714|    studies|
|61377|        aim|
|60168|   clinical|
|59275|          2|
|59221|          1|
|58274|       data|
|58087|development|
|56579|     cancer|
|50243|    disease|
|49817|   provided|
|49216|   specific|
|48857|     health|
|48536|      study|
|47827|    project|
|45573|description|
|45455|  applicant|
|44739|    program|
|44522|   patients|
+-----+-----------+
only showing top 20 rows

CSVに書き込みます

# Write CSV (I have HDFS storage)
df.coalesce(1).write.format('com.databricks.spark.csv').options(header='true').save('file:///home/username/csv_out')

追伸:私はStackoverflowの投稿から学ぶ初心者です。したがって、これが最善の方法であるかどうかはわかりません。しかし、それは私のために働いたし、それが誰かを助けることを願っています!

20
Insilico

フィールドにカンマが含まれている場合、カンマで適切に引用されないため、カンマで結合するのは良くありません。 ','.join(['a', 'b', '1,2,3', 'c'])は、_a,b,1,2,3,c_が必要なときに_a,b,"1,2,3",c_を提供します。代わりに、Pythonのcsvモジュールを使用して、RDDの各リストを適切にフォーマットされたcsv文字列に変換する必要があります。

_# python 3
import csv, io

def list_to_csv_str(x):
    """Given a list of strings, returns a properly-csv-formatted string."""
    output = io.StringIO("")
    csv.writer(output).writerow(x)
    return output.getvalue().strip() # remove extra newline

# ... do stuff with your rdd ...
rdd = rdd.map(list_to_csv_str)
rdd.saveAsTextFile("output_directory")
_

Csvモジュールはファイルオブジェクトのみに書き込むため、io.StringIO("")を使用して空の「ファイル」を作成し、csv.writerにcsv形式の文字列を書き込むように指示する必要があります。次に、output.getvalue()を使用して、「ファイル」に書き込んだ文字列を取得します。このコードをPython 2で動作させるには、ioをStringIOモジュールに置き換えてください。

Spark DataFrames APIを使用している場合、csv形式の DataBricks save function を調べることもできます。

11
Galen Long