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

PySpark分组聚合求最大值后如何显示全部列?

解决PySpark GroupBy后保留所有列的问题

我来帮你搞定这个问题~ 你遇到的核心问题是:常规的groupby+agg操作只会返回分组列和聚合计算后的列,它没办法自动关联其他列——毕竟同一个a分组里可能有多个不同的c值,Spark不知道你要取哪一个对应的c。

要实现保留所有列,同时展示每个a组中b最大值对应的整行数据,最靠谱的方法是用窗口函数(Window Functions),具体方案如下:

完整解决方案代码

from pyspark.sql import Window
from pyspark.sql.functions import row_number

# 常规创建PySpark DataFrame
sdataframe_temp = spark.createDataFrame([ (2,2,'0-2'), (2,23,'22-24')], ['a', 'b', 'c'] )
sdataframe_temp2 = spark.createDataFrame([ (4,6,'4-6'), (5,7,'6-8')], ['a', 'b', 'c'] )
# 合并两个DataFrame
sdataframe_union_1_2 = sdataframe_temp.union(sdataframe_temp2)

# 1. 定义窗口规则:按a分组,组内按b降序排序
window_spec = Window.partitionBy('a').orderBy(sdataframe_union_1_2['b'].desc())

# 2. 给每行添加组内行号,b最大的行在组内排第1位
df_with_rn = sdataframe_union_1_2.withColumn('row_num', row_number().over(window_spec))

# 3. 过滤出每个组中行号为1的行(也就是b最大的那一行),再去掉辅助的行号列
result_df = df_with_rn.filter(df_with_rn['row_num'] == 1).drop('row_num')

# 4. 可选:把b列重命名为max(b),匹配你想要的输出格式
result_df = result_df.withColumnRenamed('b', 'max(b)')

result_df.show()

运行结果

+---+------+-----+
|  a|max(b)|    c|
+---+------+-----+
|  5|     7| 6-8 |
|  2|    23|22-24|
|  4|     6| 4-6 |
+---+------+-----+

逻辑说明

  • Window.partitionBy('a'):和groupby('a')逻辑一致,把数据按a拆分成独立分组
  • orderBy(sdataframe_union_1_2['b'].desc()):每个分组内按b从大到小排序,确保最大的b排在组内第1位
  • row_number().over(window_spec):给每个分组内的行分配行号,第1位的行号是1
  • 最后过滤行号为1的行,就能得到每个a组中b最大的完整行数据

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:02:49