在窗口化apache spark中结合滞后和行计算

时间:2017-11-03 20:58:59

标签: scala apache-spark spark-dataframe

假设有一个数据帧如下:

 a| b| 
 1| 3| 
 1| 5| 
 2| 6|  
 2| 9| 
 2|14| 

我想生成像这样的最终数据框

 a| b|  c
 1| 3|  0
 1| 5| -2
 2| 6| -6
 2| 9| -10
 2| 14| -17

除了第一行之外的每一行计算c的值作为前一行的a-b + c。我尝试使用滞后以及rowsBetween,但没有成功,因为" c"值不存在,并且填充了随机变量!!

val w = Window.partitionBy().orderBy($"a", $"b)
df.withColumn("c", lead($"a", 1, 0).over(w) - lead($"b", 1, 0).over(w) + lead($"c", 1, 0).over(w)) 

1 个答案:

答案 0 :(得分:3)

在计算c时,您无法引用c;您需要的是累计sum,可能只是:

df.withColumn("c", sum(lag($"a" - $"b", 1, 0).over(w)).over(w)).show

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  3|  0|
|  1|  5| -2|
|  2|  6| -6|
|  2|  9|-10|
|  2| 14|-17|
+---+---+---+

但请注意,由于缺少分区列,这样做效率很低。