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)
就表演而言,最好的方法是什么?这两种方法有什么区别?
您可以在窗口内(您的第一种情况)或分组时(您的第二种情况)使用聚合函数。不同之处在于,对于一个窗口,每一行都将与在其整个窗口上计算的聚合结果相关联。然而,在分组时,每个组都将与该组的聚合结果相关联(一组行变成只有一行)。
在你的情况下,你会得到这个。
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)
| 归档时间: |
|
| 查看次数: |
1687 次 |
| 最近记录: |