2017-09-07 8 views
1

PySpark DataFrame(pyspark.sql.DataFrame)をPandas dataframeに変換したいと思います。組み込みメソッドtoPandas()は非常に非効率です(この問題については、Wes McKinneyの記事をFenruary 2017 hereに戻し、彼の計算をthis jupyter notebookに読んでください)。Apache Arrowを使用してPySpark DataFrameをパンダに変換する

一方、このような変換を高速化するためにいくつかの努力がなされています。例えば、ジョシュの関数hereがあります。しかし、から1M行をPandasに転送しようとして以来、それは私の役に立たなかった。 7月26日2017年にthis postに示すよう

幸いにも、著者WesLiHoldenのおかげで、toPandas()の機能が大幅にSpark 2.3Apache Arrowの実装のおかげで改善されました。つまり、私はSpark 2.3(Spark 2.1を使用しています)にアクセスすることはできません。

だから、私の質問は、私が2.1よりも古いSparkためPandas、高速にpysparkデータフレームに変換するApache Arrow機能を使用する方法です。私は多くの人々がSparkの古いバージョンで立ち往生しており、これから恩恵を受けることができると思います。

アップデート1:私は最初pysparkCSVにファイルを印刷して、Pandas強力なread_csv方法からCSVファイルを読み取ることが示唆されています。私はそれを避ける方法を見つけることを本当に願っています!

アップデート2:toPandas()方法の遅さの背後にある理由と可能out of memory問題はthis discussion

dfSpark = spark.sql(sqlQuery) 
df = dfSpark.toPandas() # Very slow/out of memory error 

答えて

1

で詳細に説明されているあなたは、中間ファイルを使用してみましたか?

ファイルをsparkから寄木張りに保存してから、パンダで読むことができます。

#spark dataframe 
df.write.parquet("path/file.parquet") 

は、より多くのを参照してください。あなたはメモリが不足している場合は、DFをサンプリングし、

また

https://arrow.apache.org/docs/python/parquet.html

import pyarrow.parquet as pq 
table = pq.read_table('example.parquet') 

#or if you want to only read some of the colums 
table = pq.read_table('example.parquet', columns=['one', 'three']) 

df = table.to_pandas() #pandas df 

、または: https://spark.apache.org/docs/2.1.0/sql-programming-guide.html#parquet-files

チェックアウトpyarrowは、寄木細工のファイルを読みますそれを書き込む前にフィルタリングしてください。

関連する問題