写点什么

Hadoop 生态系统 Hive:SQL 执行 (一)

用户头像
正向成长
关注
发布于: 2 小时前
Hadoop生态系统Hive:SQL执行(一)

本文主要是记录一些 Hive 的 SQL 语句的特殊之处。

实际问题记录

知识点一:Hive 直接访问非 GROUP BY 字段报错


报错信息提示如下:

Error while compiling statement: FAILED: SemanticException [Error 10025]: line 1:7 Expression not in GROUP BY key 'sex'
复制代码

原因分析和解决

Hive 中不允许直接访问非 GROUP BY 字段,如果需要访问,可以用 collect_set 函数收集这些字段,将该字段的所有值保存在一个数组中,使用下标访问其中的元素[1]。

SELECT collect_set(t_user.sex)[0] AS sex, t_movie.moviename,        AVG(t_rating.rate) AS avgrate, COUNT(*) AS total    FROM hive_sql_test1.t_user AS t_user    INNER JOIN hive_sql_test1.t_rating AS t_rating        ON t_user.userid=t_rating.userid    INNER JOIN hive_sql_test1.t_movie AS t_movie        ON t_movie.movieid=t_rating.movieid    WHERE t_user.sex='M'    GROUP BY t_movie.moviename    HAVING total>50    ORDER BY avgrate DESC    LIMIT 10;
复制代码

知识点二:Hive 不支持 IN/EXISTS

Hive 不支持 IN,可以采用LEFT SEMI JOIN来替代[2]。

CREATE TABLE A (    X varchar(255));
CREATE TABLE B ( Y varchar(255));
INSERT INTO A VALUES ('Amy'), ('John'), ('Lisa'), ('Marco'), ('Phil');INSERT INTO B VALUES ('Lisa'), ('Marco'), ('Phil'), ('Tim'),('Vincent');
SELECT B.Y FROM A LEFT SEMI JOIN B ON A.X = B.Y
复制代码

等价于:

SELECT B.Y FROM A	WHERE A.X  IN (SELECT B.Y FROM B);
复制代码

参考资料

  1. 关于在hive中使用 group by 的问题

  2. how to write subquery and use “In” Clause in Hive

发布于: 2 小时前阅读数: 3
用户头像

正向成长

关注

正向成长 2018.08.06 加入

想要坚定地做大规模数据处理(流数据方向),希望结合结合批处理的传统处理方式,以及之后流批混合处理方向进行学习和记录。

评论

发布
暂无评论
Hadoop生态系统Hive:SQL执行(一)