【问题标题】:Converting PySpark DataFrame to Pandas using Apache Arrow使用 Apache Arrow 将 PySpark DataFrame 转换为 Pandas
【发布时间】:2018-02-15 15:22:08
【问题描述】:

我想将 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 所示,感谢作者WesLiHolden,由于Apache Arrow 在@ 中的实现,toPandas() 的功能得到了显着改进987654337@。话虽如此,我无法访问 Spark 2.3(我使用的是 Spark 2.1)。

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

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

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

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

【问题讨论】:

    标签: pandas dataframe pyspark apache-arrow


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2019-12-25
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2017-03-17
      • 2017-03-23
      相关资源
      最近更新 更多