我想将PySpark
数据框(pyspark.sql.DataFrame
)转换为Pandas
数据框。内置方法toPandas()
效率非常低(请阅读Wes McKinney关于此问题的文章,回到2017年Fenruary here及其在this jupyter notebook中的计算)。
与此同时,已经做了一些努力来加快这种转换。一个例子是Josh的职能here。但是,这对我没有帮助,因为我希望将{1M}行从pysaprk.DataFrame
转移到Pandas
,这个解决方案对我来说不起作用。
幸运的是,如2017年7月26日的this post所示,感谢作者Wes,Li和Holden,toPandas()
的功能已经显着感谢Apache Arrow
中Spark 2.3
的实施。话虽这么说,我无法访问Spark 2.3(我正在使用Spark 2.1)。
所以,我的问题是如何使用Apache Arrow
功能将pyspark
数据帧快速转换为Pandas
,快于Spark
早于2.1。我想很多人都会遇到Spark
的旧版本,并且可以从中受益。
更新1 :我建议先将pyspark
打印到CSV
个文件,然后阅读CSV
强大Pandas
个文件read_csv
1}}方法。我真的很希望我能找到避免这样做的方法!
更新2: this discussion
详细讨论了toPandas()
方法和out of memory
问题缓慢的原因。
dfSpark = spark.sql(sqlQuery)
df = dfSpark.toPandas() # Very slow / out of memory error
答案 0 :(得分:1)
您是否尝试过使用中间文件?
您可以将文件从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进行采样或过滤。