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
相关产品推荐
相关产品推荐

