我正在尝试计算每个班级的累计总和。通过使用sum(df.value).over(Window.partitionBy('class')。orderBy('time'))代码可以正常工作
df = sqlContext.createDataFrame( [(1,10,"a"),(3,2,"a"),(1,2,"b"),(2,5,"a"),(2,1,"b"),(9,0,"b"),(4,1,"b"),(7,8,"a"),(3,8,"b"),(2,5,"a"),(0,0,"a"),(4,3,"a")],
["time", "value", "class"] )
time|value|class|
+----+-----+-----+
| 1| 10| a|
| 3| 2| a|
| 1| 2| b|
| 2| 5| a|
| 2| 1| b|
| 9| 0| b|
| 4| 1| b|
| 7| 8| a|
| 3| 8| b|
| 2| 5| a|
| 0| 0| a|
| 4| 3| a|
df.withColumn('cumsum_value', sum(df.value).over(Window.partitionBy('class').orderBy('time'))).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| 20|
| 2| 5| a| 20|
| 3| 2| a| 22|
| 4| 3| a| 25|
| 7| 8| a| 33|
+----+-----+-----+------------+
但是它不适用于重复的行。所需的输出应为:
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|
+----+-----+-----+------------+
0
投票
添加到[@pault评论中,我建议根据row_number()进行orderBy('time', 'value')计算,然后在另一[C0]中使用该列window(orderBy)获取您的w2。
这将处理两种情况:时间相同且值相同,时间相同但值不相等。cum_sum