我有一个按时间顺序排列数据的表格
订单_id | 订单状态 | 状态 | 修改时间 |
---|---|---|---|
1 | 在途 | 仓库_入 | 2024-06-22T21:53:04 |
1 | 在途 | 仓库出库 | 2024-06-23T02:06:36 |
1 | 在途 | 出站_成功 | 2024-06-23T02:28:03 |
1 | CUSTOMS_RELEASED | 航空公司 | 2024-06-23T02:29:39 |
1 | 准备取货 | 办公室 | 2024-06-23T22:35:40 |
1 | 已交付 | 拾起 | 2024-06-25T15:46:19 |
2 | 在途 | 仓库_入 | 2024-06-25T17:46:26 |
2 | 已交付 | 拾起 | 2024-06-25T18:00:00 |
我需要获取当前状态之后的 order_status 的唯一值列表。例如“输出”列中的输出。
订单_id | 订单状态 | 状态 | 修改时间 | 输出非不同值 | 输出不同值 |
---|---|---|---|---|---|
1 | 在途 | 仓库_入 | 2024-06-22T21:53:04 | IN_TRANSIT、IN_TRANSIT、CUSTOMS_RELEASED、READY_FOR_PICKUP、DELIVERED | 在途、海关已放行、准备取货、已交付 |
1 | 在途 | 仓库出库 | 2024-06-23T02:06:36 | 在途、海关已放行、准备取货、已交付 | 在途、海关已放行、准备取货、已交付 |
1 | 在途 | 出站_成功 | 2024-06-23T02:28:03 | 海关已发布,已准备好提货,已交付 | 海关已发布,已准备好提货,已交付 |
1 | CUSTOMS_RELEASED | 航空公司 | 2024-06-23T02:29:39 | 准备取货,已交付 | 准备取货,已交付 |
1 | 准备取货 | 办公室 | 2024-06-23T22:35:40 | 已交付 | 已交付 |
1 | 已交付 | 拾起 | 2024-06-25T15:46:19 | ||
2 | 在途 | 仓库_入 | 2024-06-25T17:46:26 | 已交付 | 已交付 |
2 | 已交付 | 拾起 | 2024-06-25T18:00:00 |
我认为它可能以某种方式与 LAST_VALUE 一起工作,但它可能只显示一个值,而我需要列表。
from pyspark.sql.window import Window
from pyspark.sql import functions as F
df = df.withColumn('modify_time', F.to_timestamp('modify_time'))
window_spec = Window.partitionBy('order_id').orderBy('modify_time').\
rowsBetween(Window.currentRow + 1,Window.unboundedFollowing)
df = df.withColumn('output_nondistinct_values',F.collect_list('order_status').over(window_spec)).\
withColumn('output_distinct_values',F.collect_set('order_status').over(window_spec))
df_op = df.select('order_id', 'order_status', 'status', 'modify_time', 'output_nondistinct_values', 'output_distinct_values')
df_op.display()