3

我想将PySparkDataFrame ( pyspark.sql.DataFrame)转换为 dataframe Pandas。有一个toPandas()非常低效的内置方法(请在此处阅读 Wes McKinney 在 Fenruary 2017 中关于此问题的文章以及他在此 jupyter notebook中的计算)。

与此同时,已经做了一些努力来加快这种转换。一个例子,这里是 Josh 的函数。但是,这对我没有帮助,因为我希望将 +1M 行从 转移pysaprk.DataFramePandas,这个解决方案对我不起作用。

幸运的是,正如 2017 年 7 月 26 日的这篇文章所示,感谢作者WesLiHolden ,由于in的实现,功能toPandas()得到了显着改进。话虽如此,我无法访问 Spark 2.3(我使用的是 Spark 2.1)。Apache ArrowSpark 2.3

所以,我的问题是如何使用Apache Arrow功能将数据帧转换pysparkPandasSpark于 2.1 的版本。我认为很多人都坚持使用旧版本,Spark并且可以从中受益。

更新 1:有人建议我先打印pysparkCSV文件,然后CSVPandas强大的read_csv方法读取文件。我真的希望我能找到一种方法来避免这样做!

更新 2:讨论中详细讨论了方法缓慢的原因toPandas()和可能的问题out of memory

dfSpark = spark.sql(sqlQuery)
df = dfSpark.toPandas() # Very slow / out of memory error
4

1 回答 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 读取镶木地板文件:

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 之前对其进行采样或过滤。

于 2017-09-12T15:32:12.517 回答