web-dev-qa-db-fra.com

Comment écrire le RDD résultant dans un fichier csv en Spark python

J'ai un RDD résultant labelsAndPredictions = testData.map(lambda lp: lp.label).Zip(predictions). Cela a une sortie dans ce format:

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

Ce que je veux, c'est créer un fichier CSV avec une colonne pour labels (la première partie du tuple de la sortie ci-dessus) et une autre pour predictions (deuxième partie de la sortie de Tuple). Mais je ne sais pas comment écrire dans un fichier CSV dans Spark en utilisant Python.

Comment créer un fichier CSV avec la sortie ci-dessus?

21
Jason Donnald

Juste map les lignes du RDD (labelsAndPredictions) en chaînes (les lignes du CSV) puis utilisez 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

Je sais que c'est un ancien post. Mais pour aider quelqu'un qui cherche la même chose, voici comment écrire un fichier RDD à deux colonnes en un seul fichier CSV dans PySpark 1.6.2

Le RDD:

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

Maintenant le code:

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

Le 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

Maintenant, écrivez au format 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')

P.S: Je ne suis qu’un débutant qui apprend à partir de messages ici dans Stackoverflow. Donc, je ne sais pas si c'est la meilleure façon. Mais cela a fonctionné pour moi et j'espère que cela aidera quelqu'un!

20
Insilico

Il n'est pas bon de joindre des virgules, car si les champs contiennent des virgules, ils ne seront pas correctement cités, par exemple. ','.join(['a', 'b', '1,2,3', 'c']) vous donne a,b,1,2,3,c quand vous voulez a,b,"1,2,3",c. À la place, vous devriez utiliser le module csv de Python pour convertir chaque liste du RDD en une chaîne csv correctement formatée:

# 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")

Comme le module csv n'écrit que dans des objets fichier, nous devons créer un "fichier" vide avec io.StringIO("") et demander à csv.writer d'écrire la chaîne au format csv. Ensuite, nous utilisons output.getvalue() pour obtenir la chaîne que nous venons d'écrire dans le "fichier". Pour que ce code fonctionne avec Python 2, remplacez simplement io par le module StringIO.

Si vous utilisez l'API DataFrames Spark, vous pouvez également consulter la fonction de sauvegarde DataBricks save , qui est au format CSV.

11
Galen Long