Pyspark 滞后函数返回 null

Pyspark Lag function returning null

我有一个看起来像这样的数据框

>>> df.show()
+----------------------+------------------------+--------------------+
|date_cast             |id                      |         status    |
+----------------------+------------------------+--------------------+
|            2021-02-20|    123...              |open                |
|            2021-02-21|    123...              |open                |
|            2021-02-17|    123...              |closed              |
|            2021-02-22|    123...              |open                |
|            2021-02-19|    123...              |open                |
|            2021-02-18|    123...              |closed              |
+----------------------+------------------------+--------------------+

我一直在尝试对其应用一个非常简单的滞后以查看其前一天的状态,但我一直得到空值。日期是一个字符串,所以我投了,我想这可能是由于日期未在结果中排​​序的问题。我还在我的 over partition by 中对窗口进行了硬编码,但仍然为空。

df_lag = df.withColumn('lag_status',F.lag(df['status']) \
                                 .over(Window.partitionBy("date_cast").orderBy(F.asc('date_cast')))).show()

有人可以帮助解决以下任何问题吗?

>>> column_list = ["date_cast","id"]
>>> win_spec = Window.partitionBy([F.col(x) for x in column_list]).orderBy(F.asc('date_cast'))
>>> df.withColumn('lag_status', F.lag('status').over(
...     win_spec
...     )
... )

+----------------------+------------------------+--------------------+-----------+
|date_cast             |id.                      |         staus      |lag_status|
+----------------------+------------------------+--------------------+-----------+
|            2021-02-19|    123...              |open                |       null|
|            2021-02-21|    123...              |open                |       null|
|            2021-02-17|    123...              |open                |       null|
|            2021-02-18|    123...              |open                |       null|
|            2021-02-22|    123...              |open                |       null|
|            2021-02-20|    123...              |open                |       null|
+----------------------+------------------------+--------------------+-----------+

发生这种情况是因为您按 date_cast 对数据进行了分区,并且 date_cast 具有唯一值。使用“id”代替 date_cast 例如:

df_lag = df.withColumn('lag_status',F.lag(df['status']) \
                                 .over(Window.partitionBy("id").orderBy(F.asc('date_cast')))).show()