Pyspark cumsum 在 orderBy 列中的相同值

Pyspark cumsum over same values in orderBy column

我有以下数据框:

+----+----+-----+
|col1|col2|value|
+----+----+-----+
|  11|   a|    1|
|  11|   a|    2|
|  11|   b|    3|
|  11|   a|    4|
|  11|   b|    5|
|  22|   a|    6|
|  22|   b|    7|
+----+----+-----+

我想计算按 'col1' 分区并按 'col2' 排序的 'value' 列的总和。

这是期望的输出:

+----+----+-----+------+
|col1|col2|value|cumsum|
+----+----+-----+------+
|  11|   a|    1|     1|
|  11|   a|    2|     3|
|  11|   a|    4|     7|
|  11|   b|    3|    10|
|  11|   b|    5|    15|
|  22|   a|    6|     6|
|  22|   b|    7|    13|
+----+----+-----+------+

我使用了这段代码,它给出了如下所示的 df。这不是我想要的。有人能帮助我吗?

df.withColumn("cumsum", F.sum("value").over(Window.partitionBy("col1").orderBy("col2").rangeBetween(Window.unboundedPreceding, 0)))
+----+----+-----+------+
|col1|col2|value|cumsum|
+----+----+-----+------+
|  11|   a|    2|     7|
|  11|   a|    1|     7|
|  11|   a|    4|     7|
|  11|   b|    3|    15|
|  11|   b|    5|    15|
|  22|   a|    6|     6|
|  22|   b|    7|    13|
+----+----+-----+------+

您必须在 window 子句中使用 .rowsBetween 而不是 .rangeBetween

rowsBetween (vs) rangeBetween

Example:

df.withColumn("cumsum", sum("value").over(Window.partitionBy("col1").orderBy("col2").rowsBetween(Window.unboundedPreceding, 0))).show()

#+----+----+-----+------+
#|col1|col2|value|cumsum|
#+----+----+-----+------+
#|  11|   a|    1|     1|
#|  11|   a|    2|     3|
#|  11|   a|    4|     7|
#|  11|   b|    3|    10|
#|  11|   b|    5|    15|
#|  12|   a|    6|     6|
#|  12|   b|    7|    13|
#+----+----+-----+------+