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

PySpark中groupBy函数报错:'GroupedData'对象无show属性

错误原因与解决方案

先解决你遇到的AttributeError

groupBy('winner')执行后返回的是GroupedData对象,这类对象仅支持聚合操作(如count()、sum()),不能直接调用show()方法。必须先调用聚合函数将其转换为DataFrame,再执行show()。比如仅统计各选手获胜场次的代码应为:

game_info.groupBy('winner').count().show()

针对「列出每届世界冠军获胜者」需求的完整实现

你的核心需求是按赛事维度,找出该赛事中总得分/成绩最高的选手(即冠军),完整代码如下:

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

# 读取数据集(原有代码逻辑保留)
game_info = spark.read.load("/content/chess/chess_wc_history_game_info.csv",
                     format="csv", sep=",", inferSchema="true", header="true")

# 1. 计算每个选手在单届赛事中的总获胜场次(作为成绩)
tournament_player_scores = game_info.groupBy("tournament_name", "winner")
                                   .agg(F.count("*").alias("total_wins"))

# 2. 用窗口函数筛选每届赛事中成绩最高的选手
window_spec = Window.partitionBy("tournament_name").orderBy(F.desc("total_wins"))
tournament_champions = tournament_player_scores.withColumn("rank", F.rank().over(window_spec))
                                               .filter(F.col("rank") == 1)
                                               .select("tournament_name", "winner", "total_wins")

# 输出结果
tournament_champions.show()

代码说明

  • groupBy("tournament_name", "winner").agg(F.count("*").alias("total_wins")):按赛事+选手分组,统计选手在该赛事的总胜场数(作为成绩指标)。
  • Window.partitionBy("tournament_name").orderBy(F.desc("total_wins")):创建窗口,按赛事分组后,每组内按胜场数降序排序。
  • F.rank().over(window_spec):为每个选手在所属赛事内排名,胜场最多的选手排名为1。
  • 筛选rank == 1的记录,即可得到每届赛事的冠军(若存在并列第一,会全部列出)。

内容的提问来源于stack exchange,提问作者Samar Pratap Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:27:30