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

Spark SQL计算各ID平均Rating报错问题求助

解决Spark SQL计算ID平均评分的报错问题

嘿,这个问题我太熟了!你遇到的是Spark SQL中聚合查询的基础规则问题,我来帮你一步步搞定~

错误原因分析

你写的SQL里使用了AVG(Rating)聚合函数,但没有指定分组依据。Spark SQL遵循标准SQL的规则:当SELECT子句中同时包含普通列(比如你的ID)和聚合函数时,所有普通列必须出现在GROUP BY子句里,否则Spark不知道应该按照什么维度来计算平均值,就会抛出AnalysisException这个错误。

修正后的解决方案

1. 基础修正:添加GROUP BY子句

最直接的解决方法是在SQL末尾加上GROUP BY ID,告诉Spark按照ID分组计算每个组的平均评分:

val Avg_data = spark.sql("SELECT ID, AVG(Rating) AS Avg_Rating FROM table GROUP BY ID")

这里我还把聚合结果重命名为Avg_Rating,方便后续查看和使用。

2. 完整的Spark代码示例(含数据读取)

如果还没处理数据读取的部分,这里给你一套完整的流程,确保从读取文件到计算平均值都能正常运行:

// 读取CSV文件,开启表头识别和自动推断Schema
val df = spark.read
  .option("header", "true")
  .option("inferSchema", "true")
  .csv("你的文件路径/文件名.csv")

// 创建临时视图,让Spark SQL可以访问这个数据集
df.createOrReplaceTempView("table")

// 执行修正后的聚合查询
val avgData = spark.sql("SELECT ID, AVG(Rating) AS Avg_Rating FROM table GROUP BY ID")

// 打印结果
avgData.show()

运行后你会得到类似这样的结果:

+---+----------+
| ID|Avg_Rating|
+---+----------+
|  1|       3.5|
|  2|       4.0|
+---+----------+

3. 额外优化:同时显示Name字段(如果需要)

因为你的数据里Name和ID是一一对应的(比如ID=1对应Name=A),你也可以把Name加入查询,只需要把它也加到GROUP BY里:

SELECT ID, Name, AVG(Rating) AS Avg_Rating FROM table GROUP BY ID, Name

这样结果会同时展示ID、对应的Name和平均评分,更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:08:31