将滞后与窗口化 Apache Spark 中的行计算相结合



假设有一个数据帧,如下所示:

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

但请注意,由于缺少分区列,这是低效的。

相关内容

  • 没有找到相关文章

最新更新