python - pyspark中的累积和
问题描述
我正在尝试计算每个班级的累积总和。使用 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|
+----+-----+-----+------------+
解决方案
添加到@pault
的评论中,我建议基于row_number()
计算orderBy('time', 'value')
,然后使用orderBy
另一个窗口(w2
)中的该列来获取您的cum_sum
.
这将处理时间相同且值相同以及时间相同但值不同的两种情况。
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|
+----+-----+-----+------------+
推荐阅读
- swift - 扩展与 LocationPermission 类
- console-application - Smalltalk (Pharo) 如何简单地与用户交互
- scala - 如何在嵌套对象中调用 main 方法?
- javascript - 我的承诺同时进入并抓住
- sdl - SDL_GetKeyState 未检测到日语按键
- ios - 我的整个应用程序中只有一个视图上的导航栏
- c# - 将 DataGridView 与 Crystal Report 问题 C# 链接
- dynamics-crm - 如何从 CRM Dynamics 的多个实例中删除用户?
- r - 如何通过 y 轴值为 geom_bar 着色?
- excel - 使用单元格在 Excel 中的公式中引用工作表的名称