如何在PySpark中实现GroupBy分组后的排名操作
在PySpark中实现分组排名(对应Pandas的groupby.rank)
要在PySpark中实现你需要的分组排名功能,可以通过**窗口函数(Window)**完成,对应Pandas里df.groupby(["id", "hour"])["minute"].rank()的逻辑,具体实现如下:
1. 导入必要模块
from pyspark.sql import Window from pyspark.sql.functions import rank
2. 定义窗口规范
按id和hour分组,每组内按minute升序排序:
window_spec = Window.partitionBy("id", "hour").orderBy("minute")
3. 生成排名列
使用rank()函数计算排名,和Pandas默认的无重复值场景下的排名逻辑完全匹配:
df_with_rank = df.withColumn("rank", rank().over(window_spec))
输入数据(PySpark DataFrame)
id year month date hour minute 54807 2021 12 31 6 29 54807 2021 12 31 6 31 54807 2021 12 31 7 15 54807 2021 12 31 7 30
执行后的输出结果
id year month date hour minute rank 54807 2021 12 31 6 29 1 54807 2021 12 31 6 31 2 54807 2021 12 31 7 15 1 54807 2021 12 31 7 30 2
注:如果数据存在
minute重复的情况,rank()会生成相同排名(如两个相同值都排1,下一个值排3);若需要和Pandasrank(method='first')一致的连续排名(即使重复也按出现顺序排1、2),可替换为row_number()函数。
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

