假设有一个数据帧如下:
machine_id | value
1| 5
1| 3
2| 6
2| 9
2| 14
我想生成像这样的最终数据框
machine_id | value | diff
1| 5| 1
1| 3| -1
2| 6| -4
2| 10| 0
2| 14| 4
" diff"中的值列计算为groupBy($"machine_id").avg($"value") - value
。
请注意machine_id==1
的平均值为(5+3)/2 = 4
,而machine_id ==2
的平均值为(6+10+14)/3 = 10
在Apache Spark中生成这样的最终数据帧的最佳方法是什么?
答案 0 :(得分:1)
您可以使用Window
功能获取所需的输出
将数据框设为
+----------+-----+
|machine_id|value|
+----------+-----+
|1 |5 |
|1 |3 |
|2 |6 |
|2 |10 |
|2 |14 |
+----------+-----+
您可以使用以下代码
df.withColumn("diff", avg("value").over(Window.partitionBy("machine_id")))
.withColumn("diff", 'value - 'diff)
获得最终结果
+----------+-----+----+
|machine_id|value|diff|
+----------+-----+----+
|1 |5 |1.0 |
|1 |3 |-1.0|
|2 |6 |-4.0|
|2 |10 |0.0 |
|2 |14 |4.0 |
+----------+-----+----+