web-dev-qa-db-ja.com

列名でcsvを書き込み、Pysparkのsparksqlデータフレームから生成されているcsvファイルを読み取ります

databrick csvパッケージでシェルを開始しました

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

それから私はcsvファイルを読んでgroupby操作を行い、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

Read_csvの後、または読み取り中に列名に言及してスキーマをデータフレームに追加するなどの回答はしないでください。

質問1- csvダンプを与えている間、それで列名を追加する方法はありますか?

質問2-ms officeまたはnotepad ++で開くことができる単一のcsvファイル(ディレクトリではない)を作成する方法はありますか?

注:私は現在クラスターを使用していません。spark初心者にとっては複雑すぎます。もし誰かがクラスター環境で単一ファイルにto_csvを処理する方法へのリンクを提供できるならとても助かります。

13
Satya

試して

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

これは現在の設定では問題にならないかもしれませんが、非常に大きなデータセットでは、ドライバーのメモリの問題に遭遇する可能性があることに注意してください。また、すべてが単一の場所にプッシュバックする必要があるため、これには(クラスターシナリオで)時間がかかります。

17
Mike Metzger

念のため、spark 2.1では、次の行で単一のcsvファイルを作成できます。

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")
16
FrancescoM

spark> = 2.oで、次のようなことができます

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)
9
Satya

最初の質問の答えを得た、それはcsvステートメントに加えて1つの余分なパラメータヘッダー= 'true'を渡すことの問題でした

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

#2番目の質問の代替

Topandas.to_csvを使用しますが、ここでもpandasを使用したくないので、他に方法があるかどうかを提案してください。

1
Satya