Spark Sql 与 MySql 使用 group by 的差别

刚学Spark sql,今天在使用过程中遇到一个小问题。来分享一下。

在 navicat 中使用 group by 相关语句并没出错,但是在 squirrel sql 中报了如下错误:

Error: org.apache.spark.sql.AnalysisException: expression 'XXX.`XXXX`' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.;;

错误后面说得还挺明显的,让我用 first() 函数,

那么首先我们需要知道 first() 函数是干什么的,

经查阅,first() 函数是分组第一个元素,与之对应的还有 last(),是分组最后一个元素。

接下来,我们来看一下我的原sql,我把表换成了 student(因为不知道会不会有安全隐患)。

CREATE OR REPLACE TEMPORARY VIEW ip_table AS
SELECT nickname,email,create_time,create_user_ip,count(*) as ip_count from student
GROUP BY create_user_ip
ORDER BY ip_count desc

这里我根据 create_user_ip 分组,然后想查询出分组后的数量,以及展示出对应的暱称、邮箱等。

想一下数据库会进行什么操作呢,肯定是先按 create_user_ip 分组,这样每个 ip 对应了好几条记录,这些记录的暱称、邮箱肯定是不同的,在 mysql 中,默认展示出了第一条记录的暱称和邮箱,count(*)所有记录的数量。

而在 spark sql 中就报错了,它没能分辨出到底要展示哪条记录的暱称、邮箱。

因此,我们要在这些起矛盾的维度中加 first() 函数。修改后的 sql 如下:

CREATE OR REPLACE TEMPORARY VIEW ip_table AS
SELECT first(nickname),first(email),first(create_time),create_user_ip,count(*) as ip_count from student
GROUP BY create_user_ip
ORDER BY ip_count desc

这样就不会报错啦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章