You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 20:57:28