2017-08-09 59 views
1

假设有一个数据框如下:申请合计结果的数据帧的所有未分组行火花

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 

值在最后的数据帧“差异”列计算为groupBy($"machine_id").avg($"value") - value

注意,对于machine_id==1的平均是(5+3)/2 = 4machine_id ==2(6+10+14)/3 = 10 什么是产生火花的Apache这样的数据框最终的最佳方式是什么?

回答

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 | 
+----------+-----+----+