当我们尝试将巨大的 Pandas 数据帧(40-50 百万行)转换为 Spark 2.0 数据帧时如何提高性能

Posted

技术标签:

【中文标题】当我们尝试将巨大的 Pandas 数据帧(40-50 百万行)转换为 Spark 2.0 数据帧时如何提高性能【英文标题】:how to improve performance when we try convert huge Pandas data-frame (40-50 million rows) to Spark 2.0 dataframe 【发布时间】:2017-07-12 14:23:56 【问题描述】:

我正在尝试使用以下代码将我的 pandas 数据帧转换为 spark 2.0 数据帧:

spark_df= sqlContext.createDataFrame(pandas_df)

我有几个问题:

    我想了解当我们尝试将 pandas 数据帧转换为 spark 数据帧时内部发生了什么。 据我了解,当我们尝试使用 toPandas() 方法将 spark 转换为 pandas 时,内部会发生什么,就像整个事情都属于驱动程序等。 我正在将 pandas 转换为 spark,但它花费了太多时间,似乎超过 10-12 小时。 我能想到的一个原因是因为 pandas 数据框大约有 4300 万行。 期待知道有什么方法可以让我获得一些性能提升?? 或者如果我提供明确的模式会有所帮助吗?或有什么建议?

【问题讨论】:

【参考方案1】:

为什么要从这种大小的 pandas DF 创建 Spark DF。这没有任何意义。这是一个巨大的开销,因为您通过 pandas DF 将数据加载到内存中,然后再次在 Spark 中加载。不确定您的设置如何,例如内存、集群大小等,但如果您在本地计算机上,这可能会占用您的内存。

我的建议,因为 pandas DF 具有关系格式,我猜你是从 csv 文件(或任何其他文件,如 tsv 等)创建你的 DataFrame。更好的解决方案是通过DataFrameReader 将其直接加载到 Spark DataFrame 中。您也可以传递架构,然后加载会更快。

【讨论】:

我完全同意。但我的用例有点不同,我几乎没有用 pandas 编写的脚本,而且我之前曾经将结果写在 CSV 文件中,而 R 脚本正在使用该文件。但是现在需求发生了变化,我们计划将最终的 pandas 数据帧写入 hive,所以我想使用 pyspark 脚本调用旧的 pandas 脚本并将它们转换为 pyspark 并将其保存到 hive。你能建议任何其他替代方案吗?,否则将尝试实施架构。

以上是关于当我们尝试将巨大的 Pandas 数据帧(40-50 百万行)转换为 Spark 2.0 数据帧时如何提高性能的主要内容,如果未能解决你的问题,请参考以下文章

当尝试对 pandas 数据帧进行切片时,它会引发“ValueError('Lengths must match to compare')”

高效地将大型 Pandas 数据帧读取到磁盘

当条件为真时,Pandas将数据帧分成多个

将 spark 数据帧转换为 pandas 数据帧 - ImportError: Pandas >= 0.19.2 must be installed

无法在嵌套循环中使用 pandas 附加更大的数据帧。如何更改为 numpy 向量化?

将 pandas 数据帧传递给 FastAPI 用于 NLP ML