当前位置:   article > 正文

Spark Sql 与 MySql 使用 group by 的差别_flinksql group by mysql 区别

flinksql group by mysql 区别

刚学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(因为不知道会不会有安全隐患)。

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

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

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

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

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

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

这样就不会报错啦~

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号