【问题标题】:Optimizing conversion between PySpark and pandas DataFrames优化 PySpark 和 pandas DataFrames 之间的转换
【发布时间】:2021-12-30 05:59:08
【问题描述】:

我有一个 13M 行的 pyspark 数据框,我想将其转换为 pandas 数据框。然后数据帧将被重新采样,以根据其他参数以各种频率(例如 1 秒、1 分钟、10 分钟)进行进一步分析。

从文献 [1, 2] 我发现使用以下任一行都可以加快 pyspark 到 pandas 数据帧之间的转换:

spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true") 
spark.conf.set("spark.sql.execution.arrow.enabled", "true")

但是,在数据帧转换期间,我看不到任何性能改进。所有列都是字符串,以确保它们与 PyArrow 兼容。在下面的示例中,所用时间始终在 1.4 到 1.5 分钟之间:

我看到了处理时间的变化从几秒减少到毫秒的例子 [3]。我想知道我做错了什么以及如何进一步优化代码。谢谢。

【问题讨论】:

  • 这可能取决于您的其余代码,Spark 使用惰性评估,因此取决于您调用“to_pandas()”之前的步骤,大部分执行时间可能在其他地方。
  • 您好,感谢您的回复。但上面显示的时间仅适用于屏幕截图中包含的行。此处未包含其余代码的时间。
  • 您要转换的数据框是示例中的 Sprak '范围' 还是从源读取并执行一些转换?
  • 你运行的是什么版本的 spark?
  • 如果您使用的是笔记本,您的 spark 配置已经存在。你不能以你想要的方式改变它。您需要更改启动配置以包含此设置,这取决于您在以后的版本中使用的 spark 版本,默认情况下已经启用。

标签: pandas pyspark apache-spark-sql azure-databricks pyarrow


【解决方案1】:

您是否考虑过使用Koala's? (使用 spark 数据帧的 panda 的克隆,因此您可以在 spark 数据帧上执行 panda 操作。)

【讨论】:

    【解决方案2】:

    根据 spark 的版本和您使用的笔记本,您可能不需要更改此设置。由于 Spark 2.3 默认使用箭头集成。设置后的 Spark 上下文是只读的。 (这大约 2 分钟的操作可能是您的系统识别出您已更改只读属性并重新启动 spark 并重新运行您的命令。)

    请注意,pandas 是针对小数据的,spark 是针对大数据的。 1300 万行可能是小数据,但您已经在抱怨性能,也许您应该坚持使用 spark 并使用多个执行器/分区?

    你显然可以用 Pandas 做到这一点,但是应该你吗?

    【讨论】:

    • 嗨,马特,再次感谢您提供有用的信息。 - 因为我使用的是 spark 3.1.2,所以 pyarrow 可能已经像你提到的那样默认开启。 - 我在上面提出了一个夸张的例子。在我的真实案例中,实际的数据帧是 350K 行,需要 55 秒。我使用 pandas 只是为了让我的概念证明工作。一旦 POC 工作,我将需要弄清楚如何重新采样 pyspark 数据帧。这样我就可以完全摆脱熊猫了。
    • 好的,知道了。仅供参考:您当然可以获取 pyspark 行的样本(这是一个内置函数)
    • 嗨,马特,我的意思是找到与以下 pandas 操作等效的 pyspark:“df[Value].resample(rule="15min").mean()”
    • 啊,明白了,抱歉,请在需要执行此操作时查看下面的链接。 stackoverflow.com/questions/39271374/…
    • 如果您觉得这个答案有帮助并且您感到舒服,您可以将其标记为正确吗?
    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2016-03-20
    • 2016-11-16
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多