2017-08-09 63 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 | 
+----------+-----+----+