Spark:spark 数据帧上的 agg 函数和窗口函数之间有区别吗?

Dad*_*oen 2 aggregate-functions dataframe window-functions apache-spark

我想对 spark Dataframe (Spark 2.1) 中的一列应用求和,我有两种方法可以做到这一点:

1- 使用窗口功能:

val windowing = Window.partitionBy("id")
dataframe
.withColumn("sum", sum(col("column_1")) over windowing)
Run Code Online (Sandbox Code Playgroud)

2- 使用 agg 功能:

dataframe
.groupBy("id")
.agg(sum(col("column_1")).alias("sum"))
Run Code Online (Sandbox Code Playgroud)

就表演而言,最好的方法是什么?这两种方法有什么区别?

Oli*_*Oli 8

您可以在窗口内(您的第一种情况)或分组时(您的第二种情况)使用聚合函数。不同之处在于,对于一​​个窗口,每一行都将与在其整个窗口上计算的聚合结果相关联。然而,在分组时,每个都将与该组的聚合结果相关联(一组行变成只有一行)。

在你的情况下,你会得到这个。

val dataframe = spark.range(6).withColumn("key", 'id % 2)
dataframe.show
+---+---+
| id|key|
+---+---+
|  0|  0|
|  1|  1|
|  2|  0|
|  3|  1|
|  4|  0|
|  5|  1|
+---+---+
Run Code Online (Sandbox Code Playgroud)

案例 1:开窗

val windowing = Window.partitionBy("key")
dataframe.withColumn("sum", sum(col("id")) over windowing).show
+---+---+---+                                                                   
| id|key|sum|
+---+---+---+
|  0|  0|  6|
|  2|  0|  6|
|  4|  0|  6|
|  1|  1|  9|
|  3|  1|  9|
|  5|  1|  9|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)

案例2:分组

dataframe.groupBy("key").agg(sum('id)).show
+---+-------+
|key|sum(id)|
+---+-------+
|  0|      6|
|  1|      9|
+---+-------+
Run Code Online (Sandbox Code Playgroud)