[英]Converting dataframe to dictionary in pyspark without using pandas
[英]Converting PySpark DataFrame to Pandas using Apache Arrow
我想將PySpark
DataFrame( pyspark.sql.DataFrame
)轉換為Pandas
數據幀。 有一個內置的方法toPandas()
是非常低效的(請閱讀Wes McKinney關於這個問題的文章,回到2017年Fenruary 這里以及他在這個jupyter筆記本中的計算)。
與此同時,已經做了一些努力來使這種轉換更快。 一個例子,就是Josh 在這里的功能。 但是,這對我沒有幫助,因為我希望將pysaprk.DataFrame
+ 1M行pysaprk.DataFrame
到Pandas
,這個解決方案對我來說不起作用。
幸運的是,正如2017年7月26日的這篇文章所示,感謝作者Wes , Li和Holden ,由於在Spark 2.3
實現了Apache Arrow
, toPandas()
的功能得到了顯着改善。 話雖這么說,我無法訪問Spark 2.3(我使用的是Spark 2.1)。
所以,我的問題是我如何使用Apache Arrow
功能將pyspark
數據幀快速轉換為Pandas
快速為早於2.1的Spark
。 我想很多人都會遇到舊版Spark
並且可以從中受益。
更新1 :我被建議pyspark
打印到CSV
文件,然后從Pandas
強大的read_csv
方法讀取CSV
文件。 我真的很希望我能找到避免這樣做的方法!
更新2:在討論中詳細討論了toPandas()
方法緩慢的toPandas()
和可能out of memory
不足問題
dfSpark = spark.sql(sqlQuery)
df = dfSpark.toPandas() # Very slow / out of memory error
您是否嘗試過使用中間文件?
您可以將文件從spark保存到鑲木地板,然后在pandas中讀取它。
#spark dataframe
df.write.parquet("path/file.parquet")
了解更多: https : //spark.apache.org/docs/2.1.0/sql-programming-guide.html#parquet-files
看看pyarrow閱讀鑲木地板文件:
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
此外,如果您的內存不足,請對df進行采樣,或在寫入之前對其進行過濾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.