web-dev-qa-db-fra.com

écrire un csv avec les noms de colonnes et lire un fichier csv généré à partir d'un dataframe sparksql dans Pyspark

j'ai démarré le shell avec le package csv databrick

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

Ensuite, j'ai lu un fichier csv fait quelque groupby op et dump que dans un csv.

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

S'il vous plaît, ne répondez pas comme si vous ajoutiez un schéma à dataframe après read_csv ou en lisant, mentionnez les noms des colonnes.

Question1- en donnant csv dump, y a-t-il un moyen d'ajouter du nom de colonne à celui ???

Question2: existe-t-il un moyen de créer un seul fichier csv (pas un répertoire à nouveau) pouvant être ouvert par ms office ou notepad ++ ???

note: Je ne suis pas en train d'utiliser cluster, car il est trop complexe pour un débutant comme moi. Si quelqu'un peut fournir un lien sur la manière de traiter to_csv dans un fichier unique dans un environnement en cluster, ce serait d'une grande aide.

6
Satya

Juste au cas où Sur spark 2.1, vous pouvez créer un seul fichier csv avec les lignes suivantes

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

avec étincelle> = 2.o, on peut faire quelque chose comme

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

obtenu la réponse à la 1ère question, il s’agissait de passer un paramètre supplémentaire header = 'true' avec une instruction csv

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

#Alternative pour la 2e question

Utilisation de topandas.to_csv, mais encore une fois, je ne veux pas utiliser de pandas ici, alors s'il vous plaît, suggérez-nous s'il existe un autre moyen.

0
Satya