簡體   English   中英

使用Apache Arrow將PySpark DataFrame轉換為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.DataFramePandas ,這個解決方案對我來說不起作用。

幸運的是,正如2017年7月26日的這篇文章所示,感謝作者WesLiHolden ,由於在Spark 2.3實現了Apache ArrowtoPandas()的功能得到了顯着改善。 話雖這么說,我無法訪問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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM