与 group by/join 相比,我对在窗口上运行聚合函数的性能特征感兴趣。在这种情况下,我对具有自定义框架边界或排序的窗口函数不感兴趣,而只是作为运行聚合函数的一种方式。
请注意,我只对大小合适的数据量的批处理(非流)性能感兴趣,因此我已禁用以下广播连接。
例如,假设我们从以下 DataFrame 开始:
val df = Seq(("bob", 10), ("sally", 32), ("mike", 9), ("bob", 18)).toDF("name", "age")
df.show(false)
+-----+---+
|name |age|
+-----+---+
|bob |10 |
|sally|32 |
|mike |9 |
|bob |18 |
+-----+---+
Run Code Online (Sandbox Code Playgroud)
假设我们要计算每个名称出现的次数,然后在具有匹配名称的行上提供该计数。
val joinResult = df.join(
df.groupBy($"name").count,
Seq("name"),
"inner"
)
joinResult.show(false)
+-----+---+-----+
|name |age|count|
+-----+---+-----+
|sally|32 |1 |
|mike |9 |1 |
|bob |18 |2 |
|bob |10 |2 |
+-----+---+-----+
joinResult.explain
== Physical Plan ==
*(4) Project [name#5, age#6, count#12L]
+- *(4) …Run Code Online (Sandbox Code Playgroud)