我想对Spark Dataframe(Spark 2.1)中的一列求和,有两种方法:
1-使用Window函数:
val windowing = Window.partitionBy("id")
dataframe
.withColumn("sum", sum(col("column_1")) over windowing)
2-使用agg函数:
dataframe
.groupBy("id")
.agg(sum(col("column_1")).alias("sum"))
就性能而言,最好的方法是什么?这两种方法有什么区别?
2条答案
按热度按时间wlzqhblo1#
您可以在 windows 内(第一种情况)或群组时(第二种情况)使用聚总函数。不同之处在于,使用 windows 时,每个数据列都会与在其整个 windows 上计算的聚总结果相关联。然而,群组时,每个群组都会与该群组的聚总结果相关联(一组数据列变成只有一个数据列)。
在你的情况下,你会得到这个。
情况1:窗口设置
案例2:分组
v2g6jxz62#
如@Oli所述,聚合函数可用于窗口(第一种情况)以及分组(第二种情况)。就性能而言,“分组聚合函数”比“窗口聚合函数”快得多。我们可以通过分析物理计划来可视化此功能。
1-含窗口的聚合:
2-使用GroupBy进行聚合:
根据执行计划,我们可以看到,在窗口的情况下,有一个总洗牌和一个排序,而在groupby的情况下,有一个reduced洗牌(洗牌后,本地聚合partial_sum)。