从特定值添加窗口功能

时间:2020-07-28 12:54:14

标签: apache-spark pyspark pyspark-dataframes

我正在努力解决(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

1 个答案:

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