假设有一个数据帧,如下所示:
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。我尝试使用滞后以及行之间,但没有成功,因为"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))
计算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|
+---+---+---+
但请注意,由于缺少分区列,这是低效的。