报错信息: Expression not in GROUP BY key ‘xxx’
报错含义: 字段 ‘xxx’ 没有在 group by 中
产生原因:
某些字段 ‘xxx’, 在 select 后的字段中出现, 却没有在 group by 后的字段中出现;
如下 sql 会报错, 因为, c 字段没有出现在 group by 后面
select a, b, c from table_a
group by a, b
Hive 编程指南中指出 :
GROUP BY 语句通常会和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后对每个组执行聚合操作.
在 SELECT 子句中出现的字段或属性,如果不是在聚合函数中,那就必须要放到 GROUP BY 子句里面去,反过来,没有出现在 GROUP BY 子句中的字段或属性,只能在聚合函数中
用自己的话总结概括一下就是, Hive 中所有 select 后面非聚合函数字段, 都要出现在 group by 后面.(这也是 Hive 与 MySql 的一个小区别)
修改方式:
1⃣️ 将出现在 select 后面, 却没有出现在 group by 后面的字段, 使用聚合函数包裹起来( count, sum 等普通聚合函数, 或 Hive 中高级聚合函数 collect_set 等…)
select a, b, sum(c) from table_a
group by a, b
2⃣️ 将出现在 select 后面, 却没有出现在 group by 后面的字段, 添加到 group by 后面
select a, b, c from table_a
group by a, b, c
根据对应业务进行相应修改即可
另, 使用 group by 需要注意别名问题, 由于 sql 执行顺序: group by 在 select 之前(废话,肯定是先分组最后再 select 出来), 所以 group by 后面不能加别名
如下 sql 会报错:
select a , b, ccc as C字段 from table_a
group by a, b, C字段
需要修改为:
select a , b, ccc as C字段 from table_a
group by a, b, ccc
其实也就是将 group by 后的结果集当成一张表, 那你 select 一张表, 肯定是取表中的原字段再给它起别名, 简单注意下就行.