我有一个pysparkDataframe,其中每个用户在某个时间点都有特定的状态,如下面的虚拟数据
--------------------------
|user_id| status| month |
--------------------------
| 1 | A | 12/2020|
| 1 | A | 11/2020|
| 1 | B | 10/2020|
| 1 | B | 09/2020|
| 1 | A | 08/2020|
| 1 | C | 07/2020|
| 2 | A | 12/2020|
| 2 | A | 11/2020|
| 2 | A | 10/2020|
| 2 | B | 09/2020|
我想在pyspark数据框中创建另外两个列(previous\u status\u value和previous\u status\u month),对于每个记录,这两个列表示用户与记录中的状态不同的最近日期,以及该值是什么。使用上述虚拟数据,结果将是
------------------------------------------------------------------------
|user_id| status| month | previous_status_value| previous_status_month|
------------------------------------------------------------------------
| 1 | A | 12/2020| B | 10/2020 |
| 1 | A | 11/2020| B | 10/2020 |
| 1 | B | 10/2020| A | 08/2020 |
| 1 | B | 09/2020| A | 08/2020 |
| 1 | A | 08/2020| C | 07/2020 |
| 1 | C | 07/2020| Null | Null |
| 2 | A | 12/2020| B | 09/2020 |
| 2 | A | 11/2020| B | 09/2020 |
| 2 | A | 10/2020| B | 09/2020 |
| 2 | B | 09/2020| Null | Null |
dataframe有数百万条记录,所以我试图使用窗口函数(类似于这个答案)来实现这一点,但没有实现。
1条答案
按热度按时间uurity8g1#
使用查找状态更改的位置
lead
,只保留status
以及month
与状态更改相对应,并用null屏蔽,否则使用when(F.col('begin'), F.col('status'))
,并使用F.last(..., ignorenulls=True)
.