web-dev-qa-db-de.com

schreiben eines CSV mit Spaltennamen und Lesen einer CSV-Datei, die aus einem Sparksql-Datenrahmen in Pyspark generiert wird

ich habe die Shell mit dem Dataabrick CSV-Paket gestartet

#../spark-1.6.1-bin-hadoop2.6/bin/pyspark --packages com.databricks:spark-csv_2.11:1.3.0

Dann habe ich eine CSV-Datei gelesen, habe ein paar Groupby-Operationen ausgeführt und diese in eine CSV-Datei geschrieben.

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.read.format('com.databricks.spark.csv').options(header='true').load(path.csv')   ####it has columns and df.columns works fine
type(df)   #<class 'pyspark.sql.dataframe.DataFrame'>
#now trying to dump a csv
df.write.format('com.databricks.spark.csv').save('path+my.csv')
#it creates a directory my.csv with 2 partitions
### To create single file i followed below line of code
#df.rdd.map(lambda x: ",".join(map(str, x))).coalesce(1).saveAsTextFile("path+file_satya.csv") ## this creates one partition in directory of csv name
#but in both cases no columns information(How to add column names to that csv file???)
# again i am trying to read that csv by
df_new = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("the file i just created.csv")
#i am not getting any columns in that..1st row becomes column names

Antworten Sie nicht wie das Hinzufügen eines Schemas zu einem Datenrahmen nach read_csv oder beim Lesen der Spaltennamen.

Frage1 - während ich CSV-Dump gebe, gibt es eine Möglichkeit, mit der ich einen Spaltennamen hinzufügen kann ???

Frage2 - Gibt es eine Möglichkeit, eine einzelne CSV-Datei (nicht ein neues Verzeichnis) zu erstellen, die von MS Office oder Notepad ++ geöffnet werden kann?

hinweis: Ich benutze derzeit kein Cluster, da es für Anfänger wie mich zu komplex ist. Wenn jemand einen Link zum Umgang mit to_csv in einer einzelnen Datei in einer Clusterumgebung bereitstellen kann, wäre dies eine große Hilfe.

6
Satya

Versuchen

df.coalesce(1).write.format('com.databricks.spark.csv').save('path+my.csv',header = 'true')

Beachten Sie, dass dies möglicherweise kein Problem bei Ihrem aktuellen Setup ist, bei extrem großen Datasets jedoch Speicherprobleme beim Treiber auftreten können. Dies dauert auch länger (in einem Cluster-Szenario), da alles an einen einzelnen Speicherort zurückgeschoben werden muss.

17
Mike Metzger

Für den Fall.... Von Spark 2.1 können Sie eine einzelne CSV-Datei mit den folgenden Zeilen erstellen

dataframe.coalesce(1) //So just a single part- file will be created
.write.mode(SaveMode.Overwrite)
.option("mapreduce.fileoutputcommitter.marksuccessfuljobs","false") //Avoid creating of crc files
.option("header","true") //Write the header
.csv("csvFullPath")
12
FrancescoM

mit funken> = 2.o können wir so etwas tun

df = spark.read.csv('path+filename.csv', sep = 'ifany', header=True )
df.write.csv('path_filename of csv',header=True) ###yes still in partitions
df.toPandas().to_csv('path_filename of csv',index=False)  ###single csv(Pandas Style)
7
Satya

antwort auf die erste Frage, es war eine Frage der Übergabe eines zusätzlichen Parameters header = 'true' zusammen mit der csv-Anweisung

df.write.format('com.databricks.spark.csv').save('path+my.csv',header = 'true')

#Alternativ für die 2. Frage

Topandas.to_csv verwenden, aber ich möchte auch hier keine Pandas verwenden, also schlagen Sie bitte vor, ob es einen anderen Weg gibt.

0
Satya