gpt4 book ai didi

apache-spark - 两个非常相似的 Spark Dataframe 之间性能差异的可能原因

转载 作者:行者123 更新时间:2023-12-03 06:49:12 24 4
gpt4 key购买 nike

我正在致力于提高我正在制作原型(prototype)的推荐引擎的一些 Spark 操作的性能。我偶然发现我正在使用的 DataFrame 之间存在显着的性能差异。下面是两者的describe()结果。

df1(快速,numPartitions = 4):

+-------+------------------+--------------------+
|summary| item_id| popularity|
+-------+------------------+--------------------+
| count| 187824| 187824|
| mean| 96693.34836868558| 1.0|
| stddev|55558.023793621316|5.281958866780519...|
| min| 0| 0.9999999999999998|
| max| 192806| 1.0|
+-------+------------------+--------------------+

df2(大约慢 10 倍,numPartitions = ±170):

+-------+-----------------+-----------------+
|summary| item_id| count|
+-------+-----------------+-----------------+
| count| 187824| 187824|
| mean|96693.34836868558|28.70869537439305|
| stddev|55558.02379362146|21.21976457710462|
| min| 0| 1|
| max| 192806| 482|
+-------+-----------------+-----------------+

两个 DataFrame 均已缓存,行 (187824) 和列 (2) 大小相同,并且具有相同的 item_id 列。主要区别在于,第 1 帧的第二列包含 float ,而第 2 帧包含整数。

似乎 DataFrame 2 的每个操作都慢得多,从简单的 .describe().show() 操作到更复杂的 .subtract().subtract( ).take()。在后一种情况下,DataFrame 2 需要 18 秒,而帧 1 需要 2 秒(几乎慢了 10 倍!)。

我不知道从哪里开始寻找这种差异原因的解释。非常感谢任何正确方向的提示或插入。

更新:根据 Viacheslav Rodionov 的建议,数据帧的分区数量似乎是 df2 性能问题的原因。

深入挖掘,两个数据帧都是对同一原始数据帧进行 .groupBy().agg().sortBy() 操作的结果。 .groupBy().agg() 操作产生 200 个分区,然后 .sortBy() 分别返回 4 和 ±170 个分区,为什么会这样?

最佳答案

我将首先查看df.rdd.getNumPartitions()

较小数量的较大分区几乎总是一个好主意,因为它可以更好地压缩数据并执行更多实际工作而不是操作文件。

另一件需要注意的事情是您的数据是什么样子的。它适合您想要执行的任务吗?

  • 如果它是按日期字段排序的,您将使用该字段来应用 BETWEEN 操作,那么它会比仅处理未排序的数据更快。
  • 如果您使用特定的月份或年份,则可以按这些月份或年份对数据进行分区。
  • ID 也是如此。如果您使用某些 ID,请通过对数据集进行分区/排序来使相同的 ID 彼此“靠近”。

存储数据时我的经验法则 - 首先按几个低基数字段(主要是 bool 值和日期)进行分区,然后使用数据中的 sortWithinPartitions所有其他字段进行排序重要性顺序。这样您将获得最佳的压缩率(意味着更快的处理时间)和更好的数据局部性(同样更快的处理时间)。但一如既往,这一切都取决于您的用例,始终考虑如何处理数据并相应地准备数据。

关于apache-spark - 两个非常相似的 Spark Dataframe 之间性能差异的可能原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40018631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com