当我们尝试将巨大的 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')”
将 spark 数据帧转换为 pandas 数据帧 - ImportError: Pandas >= 0.19.2 must be installed