问题在标题中,但是您如何在Pyspark中创建一个新列,该列累计先前重复值的数量?
例如:
| Value
| 0
| 0
| 5
| 5
| -1
| 0
| 0
| 0
将其应用于value
列将产生新的值列
| Value | Result
| 0 | 1
| 0 | 2
| 5 | 1
| 5 | 2
| -1 | 1
| 0 | 1
| 0 | 2
| 0 | 3
答案 0 :(得分:0)
一种解决方案是利用行号之间的差异来创建组。
group = (row_number order by "ID") - (row_number partition by "Value", order by "ID")
然后使用组列来计算row_number()
作为结果。
这里是一个例子:
data = [(0, 0), (1, 0), (2, 5), (3, 5),
(4, -1), (5, 0), (6, 0), (7, 0)
]
df = spark.createDataFrame(data, ["ID", "Value"])
df.withColumn("grp",
row_number().over(Window.orderBy(col("ID")))
- row_number().over(Window.partitionBy("Value").orderBy(col("Id")))
) \
.withColumn("Result", row_number().over(Window.partitionBy("grp").orderBy(col("ID")))) \
.drop("grp")\
.show()
+---+-----+------+
| ID|Value|Result|
+---+-----+------+
| 0| 0| 1|
| 1| 0| 2|
| 2| 5| 1|
| 3| 5| 2|
| 5| 0| 1|
| 6| 0| 2|
| 7| 0| 3|
| 4| -1| 1|
+---+-----+------+