首页 > 解决方案 > Pyspark:如何在日期上创建窗口

问题描述

我想通过创建一个可以包含给定日期的窗口来仅对数据框的指定子集进行计算:

df=df.orderBy('Date')
window_row = Window.partitionBy('I1','Id2')
df=df.withColumn('max_Date', when((col('Date')<=target_date),max('Date').over(window_row)))
df=df.withColumn('cum_sum', when((col('Date')==col('max_Date')),sum('Sale').over(window_row)))

target_date= '2020-01-01',我得到以下输出:

|I1| Id2|         Date|  Sale|  max_Date|cum_sum|
+--+----+-------------+------+----------+------+
|AA|  B0|   2019-07-01|     1|2020-12-01|   null|
|AA|  B0|   2020-01-01|    23|2020-12-01|   null|
|AA|  B0|   2020-01-01|     2|2020-01-01|   null|
|AA|  B0|   2020-02-01|     0|      null|   null|
|AA|  B0|   2020-12-01|   116|      null|   null|
|BB|  C0|   2019-03-01|     1|2020-03-01|   null|
|BB|  C0|   2019-05-01|    26|2020-03-01|   null|
|BB|  C0|   2020-03-01|     1|      null|   null|
|CC|  B0|   2019-03-01|     8|2019-04-01|   null|
|CC|  B0|   2019-04-01|     1|2019-04-01|      1|

但是,所需的输出是:

|I1| Id2|         Date|  Sale|  max_Date|cum_sum|
+--+----+-------------+------+----------+------+
|AA|  B0|   2019-07-01|     1|2020-01-01|   null|
|AA|  B0|   2020-01-01|    23|2020-01-01|     25|
|AA|  B0|   2020-01-01|     2|2020-01-01|     25|
|AA|  B0|   2020-02-01|     0|      null|   null|
|AA|  B0|   2020-12-01|   116|      null|   null|
|BB|  C0|   2019-03-01|     1|2019-05-01|   null|
|BB|  C0|   2019-05-01|    26|2019-05-01|     26|
|BB|  C0|   2020-03-01|     1|      null|   null|
|CC|  B0|   2019-03-01|     8|2019-04-01|   null|
|CC|  B0|   2019-04-01|     1|2019-04-01|      1|

我如何以有效的方式实现这一点?

标签: datepysparkwindow

解决方案


这可能有帮助

>>> w = Window.partitionBy("date")
>>> w_preceding = Window.partitionBy("I1","ID2").orderBy('DATE').rangeBetween(Window.unboundedPreceding, 0)
>>> df=df.withColumn('max_Date', when((col('Date')<=target_date),max('Date').over(w)))
>>> df=df.withColumn('cum_sum', when((col('Date')==col('max_Date')),sum('Sale').over(w_preceding)))
>>> df.show()
+----------+---+---+----+----------+-------+
|      Date| I1|Id2|Sale|  max_Date|cum_sum|
+----------+---+---+----+----------+-------+
|2019-05-01| BB| C0|  26|2019-05-01|   26.0|
|2020-03-01| BB| C0|   1|2020-03-01|   27.0|
|2019-07-01| AA| B0|   1|2019-07-01|    2.0|
|2019-07-01| AA| B0|   1|2019-07-01|    2.0|
|2020-02-01| AA| B0|   0|2020-02-01|    2.0|
|2020-09-01| AA| B0|   0|      null|   null|
|2019-04-01| CC| B0|   1|2019-04-01|    1.0|
+----------+---+---+----+----------+-------+

推荐阅读