【问题标题】:Bring max value from a table based on the values of another table with PySpark使用 PySpark 根据另一个表的值从一个表中获取最大值
【发布时间】:2021-09-23 23:00:53
【问题描述】:

我有两个 Spark DataFrame,第一个 (Events) 包含以下事件信息:

Event_id Date User_id
1 2019-04-19 1
2 2019-05-30 2
3 2020-01-20 1

第二个(User)包含来自用户的信息如下:

Id User_id Date Weight-kg
1 1 2019-04-05 78
2 1 2019-04-17 75
3 2 2019-10-10 50
4 1 2020-02-10 76

我想知道的是如何使用 PySpark 在 Event Date 之前从 User 获取最新的权重值?

此代码的返回必须如下表:

Event_id Date User_id Weight-kg
1 2019-04-19 1 75
2 2019-05-30 2 null
3 2020-01-20 1 75

【问题讨论】:

  • 是的,你没看错,我要的是活动日期前的最新体重值

标签: pyspark


【解决方案1】:

这个想法是让用户加入事件,然后根据日期对权重进行排名以获得最新的事件

from pyspark.sql import functions as F
from pyspark.sql import Window as W

(event
    # left join to keep all events
    # note the join condition where
    # event's date >= user's date
    .join(
        user,
        on=[
            event['User_id'] == user['User_id'],
            event['Date'] >= user['Date'],
        ],
        how='left'
    )

    # rank user's weight to get the latest
    # based on the dates that already filtered by event's date
    .withColumn('rank_weight', F.rank().over(W.partitionBy(user['User_id']).orderBy(User['Date'].desc())))
    .where(F.col('rank_weight') == 1)
    .drop('rank_weight')
 
    # drop unnecessary columns
    .drop(user['User_id'])
    .drop(user['Date'])
    .drop('Id')


    .orderBy('Event_id')
    .show()
)

# Output
# +--------+----------+-------+------+
# |Event_id|      Date|User_id|Weight|
# +--------+----------+-------+------+
# |       1|2019-04-19|      1|    75|
# |       2|2019-05-30|      2|  null|
# |       3|2020-01-20|      1|    75|
# +--------+----------+-------+------+

【讨论】:

  • 感谢您的帮助!如果我将 orderBy 从 Weight 替换为 User['Date'].desc() 它就完美了!
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2017-01-02
  • 2021-11-05
相关资源
最近更新 更多