pyspark 根据另一个表日期列中的日期对日期列进行排名

toiithl6  于 2023-04-11  发布在  Spark
关注(0)|答案(1)|浏览(199)

我有以下表格

df_obs.show()
项目编号观察日期
项目12021-09-20 2021-09-20 2021-09-20
项目12022-12-05 - 05 - 2022-12-05
项目22022-10-27 2022-10-27
项目12022-09-20 2022-09-20
项目22023-02- 20 2023-02-20 2023-02-20
项目22023-03- 20 2023-03-20 2023-03-20
项目12023-01-20 2023-01-20 2023-01-20
df_purchase.withColumn("rank", dense_rank().over(Window.partitionBy("ITEM_No").orderBy(asc("Date_Purchase")))).show()
项目_编号日期_购买
项目12021-08-21 - 2021-08-211
项目12022-02-23 2022-02-23 2022-02-23
项目12022-12-29 - 2022-12-29
项目22022-09-20 2022-09-201
项目22023-01-20 2023-01-20 2023-01-20

我想根据df_purchase中的排名对df_obs Date_Observed列进行排名,即Date_Observed介于哪个日期范围之间

需要输出

项目编号观察日期
项目12021-09-20 2021-09-20 2021-09-201
项目12022-12-05 - 05 - 2022-12-05
项目22022-10-27 2022-10-271
项目12022-09-20 2022-09-20
项目22023-02- 20 2023-02-20 2023-02-20
项目22023-03- 20 2023-03-20 2023-03-20
项目12023-01-15 2023-01-15 2023-01-15

示例:df_obs中的第2行获得排名2,因为Date_Observed(2022-12-05)在df_purchase表中的2022-02-23(排名2)和2022-12-29(排名3)之间

3phpmpom

3phpmpom1#

定义连接条件以匹配具有相同项目编号但左侧数据框中的观察日期必须大于右侧的购买日期的行,然后在此条件下连接数据框,然后使用max分组并聚合排名

cond = (df_obs['Item No'] == df_purchase['Item_No']) & \
       (df_obs['Date_Observed'] >= df_purchase['Date_Purchase'])

result = (
    df_obs
    .join(df_purchase, on=cond, how='left')
    .groupBy(*df_obs.columns)
    .agg(F.max('rank').alias('rank'))
)

结果

+-------+-------------+----+
|Item No|Date_Observed|rank|
+-------+-------------+----+
| Item 1|   2021-09-20|   1|
| Item 1|   2022-12-05|   2|
| Item 2|   2022-10-27|   1|
| Item 1|   2022-09-20|   2|
| Item 2|   2023-02-20|   2|
| Item 2|   2023-03-20|   2|
| Item 1|   2023-01-20|   3|
+-------+-------------+----+

相关问题