假设有一个数据帧如下:
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))
答案 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|
+---+---+---+
但请注意,由于缺少分区列,这样做效率很低。