将汇总结果应用于spark

时间:2017-08-09 00:59:00

标签: scala apache-spark

假设有一个数据帧如下:

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中生成这样的最终数据帧的最佳方法是什么?

1 个答案:

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