我正在研究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上执行类似的操作吗?因为我需要从一行计算出的值才能计算另一行的值。
答案 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|
+---+----+----+---+