Python Pypark中的累积和

Python Pypark中的累积和,python,dataframe,pyspark,Python,Dataframe,Pyspark,我试图计算每个类的累积总和。代码使用sum(df.value).over(Window.partitionBy('class').orderBy('time'))运行良好 但它不能处理重复的行。所需输出应为: time|value|class|cumsum_value| +----+-----+-----+------------+ | 1| 2| b| 2| | 2| 1| b| 3| | 3| 8| b

我试图计算每个类的累积总和。代码使用sum(df.value).over(Window.partitionBy('class').orderBy('time'))运行良好

但它不能处理重复的行。所需输出应为:

 time|value|class|cumsum_value|
+----+-----+-----+------------+
|   1|    2|    b|           2|
|   2|    1|    b|           3|
|   3|    8|    b|          11|
|   4|    1|    b|          12|
|   9|    0|    b|          12|
|   0|    0|    a|           0|
|   1|   10|    a|          10|
|   2|    5|    a|          15|
|   2|    5|    a|          20|
|   3|    2|    a|          22|
|   4|    3|    a|          25|
|   7|    8|    a|          33|
+----+-----+-----+------------+
除了
@pault
的评论之外,我建议根据
orderBy('time','value')
计算
行数()
,然后在另一个窗口的
中使用该列(
)要获取您的
累计金额

这将处理两种情况:时间相同,值相同;时间相同,值不同


似乎您需要
.orderBy('time','value')
(即,您必须定义在时间相同的情况下如何断开联系)
 time|value|class|cumsum_value|
+----+-----+-----+------------+
|   1|    2|    b|           2|
|   2|    1|    b|           3|
|   3|    8|    b|          11|
|   4|    1|    b|          12|
|   9|    0|    b|          12|
|   0|    0|    a|           0|
|   1|   10|    a|          10|
|   2|    5|    a|          15|
|   2|    5|    a|          20|
|   3|    2|    a|          22|
|   4|    3|    a|          25|
|   7|    8|    a|          33|
+----+-----+-----+------------+
from pyspark.sql import functions as F
from pyspark.sql.window import Window
w1=Window().partitionBy("class").orderBy("time","value")
w2=Window().partitionBy("class").orderBy('rownum')
df.withColumn('rownum', F.row_number().over(w1))\
  .withColumn('cumsum_value', F.sum("value").over(w2)).drop('rownum').show()

+----+-----+-----+------------+
|time|value|class|cumsum_value|
+----+-----+-----+------------+
|   1|    2|    b|           2|
|   2|    1|    b|           3|
|   3|    8|    b|          11|
|   4|    1|    b|          12|
|   9|    0|    b|          12|
|   0|    0|    a|           0|
|   1|   10|    a|          10|
|   2|    5|    a|          15|
|   2|    5|    a|          20|
|   3|    2|    a|          22|
|   4|    3|    a|          25|
|   7|    8|    a|          33|
+----+-----+-----+------------+