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

