【发布时间】:2021-09-22 07:25:06
【问题描述】:
我有一个 PySpark 数据帧,我想在将 groupBy 应用于 2 列(即 CUSTOMER_ID 和 ADDRESS_ID)之后获得 ORDERED_TIME(日期时间字段 yyyy-mm-dd 格式)的第二高值。
一个客户可以有许多与一个地址相关联的订单,我想获得(customer,address) 对的第二个最近的订单
我的做法是按照CUSTOMER_ID和ADDRESS_ID做一个窗口和分区,按ORDERED_TIME 排序
sorted_order_times = Window.partitionBy("CUSTOMER_ID", "ADDRESS_ID").orderBy(col('ORDERED_TIME').desc())
df2 = df2.withColumn("second_recent_order", (df2.select("ORDERED_TIME").collect()[1]).over(sorted_order_times))
但是,我收到一条错误消息,提示 ValueError: 'over' is not in list
谁能提出解决这个问题的正确方法?
如果需要任何其他信息,请告诉我
样本数据
+-----------+----------+-------------------+
|USER_ID |ADDRESS_ID| ORDER DATE |
+-----------+----------+-------------------+
| 100| 1000 |2021-01-02 |
| 100| 1000 |2021-01-14 |
| 100| 1000 |2021-01-03 |
| 100| 1000 |2021-01-04 |
| 101| 2000 |2020-05-07 |
| 101| 2000 |2021-04-14 |
+-----------+----------+-------------------+
预期输出
+-----------+----------+-------------------+-------------------+
|USER_ID |ADDRESS_ID| ORDER DATE |second_recent_order
+-----------+----------+-------------------+-------------------+
| 100| 1000 |2021-01-02 |2021-01-04
| 100| 1000 |2021-01-14 |2021-01-04
| 100| 1000 |2021-01-03 |2021-01-04
| 100| 1000 |2021-01-04 |2021-01-04
| 101| 2000 |2020-05-07 |2020-05-07
| 101| 2000 |2021-04-14 |2020-05-07
+-----------+----------+-------------------+-------------------
【问题讨论】:
-
您能否提供一些示例数据以及预期的输出?
-
对不起,我已经用示例输入和输出编辑了问题
标签: python dataframe apache-spark pyspark group-by