使用Apache Arrow将PySpark DataFrame转换为Pandas

时间:2017-09-07 02:38:13

标签: pandas dataframe pyspark apache-arrow

我想将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所示,感谢作者WesLiHoldentoPandas()的功能已经显着感谢Apache ArrowSpark 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

1 个答案:

答案 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进行采样或过滤。