在 pyspark 中获取以下所有不同的值

问题描述 投票:0回答:1

我有一个按时间顺序排列数据的表格

订单_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 一起工作,但它可能只显示一个值,而我需要列表。

pyspark
1个回答
0
投票
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()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.