您可以在window 上使用lag 函数,如下所示:
from pyspark.sql import Window
from pyspark.sql import functions as F
window = Window().partitionBy("CUSTOMER_ID").orderBy('ORDERED_TIME')
dataframe.withColumn('PREV_ORDER_TIME', F.lag('ORDERED_TIME').over(window))
如果没有先前的订单,列PREV_ORDER_TIME 将是null
如果您只想为 2021-01-01 和 2021-03-31 之间的日期计算此 PREV_ORDER_TIME 列,则可以添加 when 子句,如下所示:
from datetime import datetime
from pyspark.sql import Window
from pyspark.sql import functions as F
window = Window().partitionBy("CUSTOMER_ID").orderBy('ORDERED_TIME')
dataframe.withColumn(
'PREV_ORDER_TIME',
F.when(
(F.col('ORDERED_TIME') < datetime(2021, 4, 1)) & (F.col('ORDERED_TIME') >= datetime(2021, 1, 1)),
F.lag('ORDERED_TIME').over(window)
)
)
对于日期不在 2021-01-01 和 2021-03-31 之间的所有订单,PREV_ORDER_TIME 列将是 null
所以如果你有以下输入数据框:
+-----------+--------+-------------------+
|CUSTOMER_ID|ORDER_ID|ORDERED_TIME |
+-----------+--------+-------------------+
|1 |21 |2019-12-15 10:20:30|
|1 |22 |2020-12-16 11:21:31|
|1 |23 |2021-01-17 12:22:32|
|2 |24 |2021-01-18 13:23:33|
|2 |25 |2021-02-19 14:24:34|
|2 |26 |2021-03-20 15:25:35|
+-----------+--------+-------------------+
你会得到以下输出:
+-----------+--------+-------------------+-------------------+
|CUSTOMER_ID|ORDER_ID|ORDERED_TIME |PREV_ORDER_TIME |
+-----------+--------+-------------------+-------------------+
|1 |21 |2019-12-15 10:20:30|null |
|1 |22 |2020-12-16 11:21:31|null |
|1 |23 |2021-01-17 12:22:32|2020-12-16 11:21:31|
|2 |24 |2021-01-18 13:23:33|null |
|2 |25 |2021-02-19 14:24:34|2021-01-18 13:23:33|
|2 |26 |2021-03-20 15:25:35|2021-02-19 14:24:34|
+-----------+--------+-------------------+-------------------+