【发布时间】:2019-05-04 17:57:15
【问题描述】:
我有一个包含以下数据的 pyspark 数据框:
| y | date | amount| id |
-----------------------------
| 1 | 2017-01-01 | 10 | 1 |
| 0 | 2017-01-01 | 2 | 1 |
| 1 | 2017-01-02 | 20 | 1 |
| 0 | 2017-01-02 | 3 | 1 |
| 1 | 2017-01-03 | 2 | 1 |
| 0 | 2017-01-03 | 5 | 1 |
我想应用一个窗口函数,但只对 y==1 的列应用 sum 聚合函数,但仍保留其他列。
我要申请的窗口是:
w = Window \
.partitionBy(df.id) \
.orderBy(df.date.asc()) \
.rowsBetween(Window.unboundedPreceding, -1)
结果数据框如下:
| y | date | amount| id | sum |
-----------------------------------
| 1 | 2017-01-01 | 10 | 1 | 0 |
| 0 | 2017-01-01 | 2 | 1 | 0 |
| 1 | 2017-01-02 | 20 | 1 | 10 | // =10 (considering only the row with y==1)
| 0 | 2017-01-02 | 3 | 1 | 10 | // same as above
| 1 | 2017-01-03 | 2 | 1 | 30 | // =10+20
| 0 | 2017-01-03 | 5 | 1 | 30 | // same as above
这可行吗?
我尝试使用sum(when(df.y==1, df.amount)).over(w),但没有返回正确的结果。
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql window-functions