PySpark按日期分组获取created列最大值对应行的实现求助
解决方法:获取每组中
created最大的行 你的需求是按id和date分组,提取每个分组里created值最大的那一行。你之前的代码只是拿到了每个组的最大created值并做了关联,但没有过滤出匹配的行,所以才没得到预期结果。下面提供两种可行的方案:
方案1:使用窗口函数(高效推荐)
窗口函数可以直接在原DataFrame上完成分组排序,快速定位到每个组的目标行,不需要额外的关联操作:
from pyspark.sql import functions as F from pyspark.sql.window import Window # 定义窗口规则:按id和date分组,按created降序排序 window_spec = Window.partitionBy("id", "date").orderBy(F.desc("created")) # 添加行号标记,过滤出每个组的第一行(即created最大的行) result_df = df.withColumn("row_num", F.row_number().over(window_spec)) \ .filter(F.col("row_num") == 1) \ .drop("row_num") result_df.show()
如果你的数据中存在同一组内多个行的created值相同且都是最大值的情况,可以把row_number()换成rank(),这样会保留所有符合条件的行,而不是只取其中一行。
方案2:完善你原来的代码
如果你想基于自己的思路修改,只需要在关联后添加过滤步骤即可:
# 先获取每个组的最大created值 df2 = df.groupby(['id', 'date']).agg(F.max('created').alias('created_max')) # 关联回原DataFrame df3 = df.join(df2, on=['id', 'date'], how='left') # 过滤出created等于组内最大值的行,再删除辅助列 result_df = df3.filter(F.col('created') == F.col('created_max')).drop('created_max') result_df.show()
这两种方法都能得到你期望的结果,窗口函数的方法在大数据场景下性能更优,因为避免了join操作带来的开销。
内容的提问来源于stack exchange,提问作者Rasika
相关产品推荐
相关产品推荐

