我正在努力解决(Py)Spark问题。
我在有序数据框中有一个列“ col”,需要一种将0元素相加的方法。我需要的是“ sum_from_0”列。 我尝试使用窗口函数,但未成功。 任何有关如何解决此任务的想法将不胜感激。 预先谢谢你。
col sum_from_0
0 None
0 None
1 1
2 3
1 4
4 8
3 11
0 None
0 None
0 None
1 1
2 3
3 6
3 9
2 11
0 None
0 None
答案 0 :(得分:3)
没有排序列,因此我首先做到了,并添加了一些临时列来分隔总和组。之后,对group
分区求和,并按id
窗口(例如
import org.apache.spark.sql.expressions.Window
val w1 = Window.orderBy("id")
val w2 = Window.partitionBy("group").orderBy("id")
df.withColumn("id", monotonically_increasing_id)
.withColumn("zero", (col("col") === 0).cast("int"))
.withColumn("group", sum("zero").over(w1))
.withColumn("sum_from_0", sum("col").over(w2))
.orderBy("id")
.drop("id", "group", "zero")
.show(20, false)
给出结果:
+---+----------+
|col|sum_from_0|
+---+----------+
|0 |0 |
|0 |0 |
|1 |1 |
|2 |3 |
|1 |4 |
|4 |8 |
|3 |11 |
|0 |0 |
|0 |0 |
|0 |0 |
|1 |1 |
|2 |3 |
|3 |6 |
|3 |9 |
|2 |11 |
|0 |0 |
|0 |0 |
+---+----------+