Python Pypark中的累积和
我试图计算每个类的累积总和。代码使用sum(df.value).over(Window.partitionBy('class').orderBy('time'))运行良好 但它不能处理重复的行。所需输出应为: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
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|
+----+-----+-----+------------+