根据同一列上的另一行值计算Spark列值

时间:2020-05-29 11:38:15

标签: apache-spark apache-spark-sql

我正在研究Apache Spark 2.3.0 cloudera4,但在处理数据框时遇到问题。

我有这个输入数据框:

+---+---+----+
| id| d1| d2 |
+---+---+----+
|  1|   | 2.0|
|  2|   |-4.0|
|  3|   | 6.0|
|  4|3.0|    |
+---+---+----+

我需要此输出:

+---+---+----+----+
| id| d1| d2 |  r |
+---+---+----+----+
|  1|   | 2.0| 7.0|
|  2|   |-4.0| 5.0|
|  3|   | 6.0| 9.0|
|  4|3.0|    | 3.0|
+---+---+.---+----+

从迭代的角度来看,哪一个获得最大的id行(4)并将d1值放在r列上,然后取下一行(3)并将r [4] + d2 [3]放在r上列,依此类推。

可以在Spark上执行类似的操作吗?因为我需要从一行计算出的值才能计算另一行的值。

1 个答案:

答案 0 :(得分:1)

这个怎么样?重要位是sum($"r1").over(Window.orderBy($"id".desc),它计算列的累加和。除此之外,我正在创建几个帮助器列以获取最大id并正确排序。

val result = df
  .withColumn("max_id", max($"id").over(Window.rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)))
  .withColumn("r1", when($"id" === $"max_id", $"d1").otherwise($"d2"))
  .withColumn("r", sum($"r1").over(Window.orderBy($"id".desc)))
  .drop($"max_id").drop($"r1")
  .orderBy($"id")
result.show


+---+----+----+---+
| id|  d1|  d2|  r|
+---+----+----+---+
|  1|null| 2.0|7.0|
|  2|null|-4.0|5.0|
|  3|null| 6.0|9.0|
|  4| 3.0|null|3.0|
+---+----+----+---+