使用Spark SQL分组聚合查询时遭遇AnalysisException错误求助
解决Spark SQL的AnalysisException错误
嘿,我一眼就瞅出你遇到的这个org.apache.spark.sql.AnalysisException: Can't extract value from sum(_c9#30);错误的根源了,主要是SQL语法的几个小问题,咱们一步步修正:
1. 别名写法错了!
你写的sum(_c9).as(sumAadhar)是典型的语法误用——Spark SQL里给聚合函数结果起别名,不能用点号.调用as方法,正确的写法是sum(_c9) AS sumAadhar(AS可以省略,直接用空格分隔也可以)。你原来的写法会让Spark误以为要从sum函数的返回值里提取as属性,而sum的结果是个单纯的数值,根本没有这个属性,自然就报错了。
2. ORDER BY的列选得不对
你写的order by _c9 desc是对原始的_c9列排序,但分组之后每个_c3组只有一个求和结果,用原始列排序完全没意义,应该按你求和后的sumAadhar列来排序才对。
3. 多余的DISTINCT
select distinct和group by _c3一起用纯属画蛇添足——group by _c3本身就会保证_c3的唯一性,不需要再额外加distinct。
修正后的完整SQL语句
spark.sql("select _c3, sum(_c9) as sumAadhar from aadhar group by _c3 order by sumAadhar desc LIMIT 3").show
额外提醒:注意列的数据类型
从你给出的schema来看,所有列都是string类型,如果求和结果不对(比如得到0或者null),那大概率是因为_c9是字符串,没法直接求和。这时候你需要先把它转换成数值类型,比如长整型或者浮点型,修正后的语句如下:
spark.sql("select _c3, sum(cast(_c9 as long)) as sumAadhar from aadhar group by _c3 order by sumAadhar desc LIMIT 3").show
这样执行就不会报错,还能得到你想要的:按_c3分组、对_c9求和、按求和结果倒序取前3条的数据。
内容的提问来源于stack exchange,提问作者Kumar Harsh
相关产品推荐
相关产品推荐

