[解决方案]spark 2.4 报错:grouping expressions sequence is empty, *** is not an aggregate function.

Posted Sinsa_SI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[解决方案]spark 2.4 报错:grouping expressions sequence is empty, *** is not an aggregate function.相关的知识,希望对你有一定的参考价值。

写在最前面

这里仅讨论spark 升级到 2.4 过程中 having 条件语句导致报错的情形,其他情形请参考 Spark中进行聚合时的特殊场景

一、报错详情

code

select id
	, content_map
from test_db.test_tb
having content_map is not null 

error

grouping expressions sequence is empty, and 'test_db.test_tb
.`id`' is not an aggregate function. Wrap '()' in windowing function(s) or wrap 'test_db.test_tb
.`id`' in first() (or first_value) if you don't care which value you get.;;

二、分析原因

在 spark 2.3 中,上面的 sql 执行正常,升级至 2.4 后才报错。主要的原因在于这两个版本对 having 条件语句计算逻辑不一样,2.4 执行过程中将 having 条件语句视为聚合运算后的一种过滤操作。源码中的解释:

In case of HAVING (a filter after an aggregate) we use both the aggregate and its child for resolution.

参考 源码解释Spark中进行聚合时的特殊场景

三、解决方案

替换 having 条件表达,例如换成 where 条件。

select id
	, content_map
from test_db.test_tb
where content_map is not null 

以上是关于[解决方案]spark 2.4 报错:grouping expressions sequence is empty, *** is not an aggregate function.的主要内容,如果未能解决你的问题,请参考以下文章

Spark 报错解决--Error initializing SparkContext

在 Spark 2.4 中使用正则表达式替换向数据帧输出添加空值

Apache Spark启动spark-sql报错

spark报错解决

Spark 2.4 standalone 部署

spark-shell启动报错如下。请问该如何解决。多谢帮助!