使用Apache Arrow将PySpark DataFrame转换为Pandas

3
我想将一个PySpark DataFrame (pyspark.sql.DataFrame)转换为Pandas dataframe。有一个内置方法toPandas(),但效率非常低(请阅读Wes McKinney在2017年2月关于这个问题的文章here和他在this jupyter notebook中的计算)。
与此同时,一些努力已经被做出来使这样的转换更快。例如,Josh的函数here。然而,由于我需要从pysaprk.DataFrame转移+1M行到Pandas,所以这个解决方案对我没有用。
幸运的是,正如2017年7月26日这篇文章所示,由于作者WesLiHoldenSpark 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() 方法速度缓慢和可能出现的内存不足问题的原因在this discussion中详细讨论。
dfSpark = spark.sql(sqlQuery)
df = dfSpark.toPandas() # Very slow / out of memory error
1个回答

1

你尝试过使用中间文件吗?

你可以从Spark将文件保存为parquet格式,然后在Pandas中读取。

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

查看更多信息: https://spark.apache.org/docs/2.1.0/sql-programming-guide.html#parquet-files

了解pyarrow读取parquet文件:

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进行抽样或筛选。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接