Hive知识点总结(一)(基本概念、运行方式、创建库表、数据读取、文件格式):点击查看
Hive知识点总结(二)(数据类型及修改表定义):点击查看
5、hive查询语法
hive在1.2.0之前不支持“不等值”join,但在1.2.0后支持不等值join,只是语法必须按如下形式写:
SELECT A.*,B.* from A,B WHERE A.ID>B.ID;
基本查询语法跟标准sql基本一致;
SELECT FIELDS,FUNCTION(FIELDS)
FROM T1
JOIN T2
WHERE CONDITION
GROUP BY FILEDS
HAVING CONDTION
ORDER BY FIELDS DESC|ASC
select
a.name as aname,
a.numb as anumb,
b.name as bname,
b.nick as bnick
from t_a a
right outer join t_b b
on a.name=b.name
hive中不支持exist/IN子查询,可以用hive特殊的left semi join(不会取右表的数据)来实现同样的效果:
select
a.name as aname,
a.numb as anumb
from t_a a
left semi join t_b b
on a.name=b.name;
注意: left semi join的 select子句中,不能有右表的字段
我们重点总结一下group by 分组查询:
select dt,count(*),max(ip) as cnt from t_access group by dt;
select dt,count(*),max(ip) as cnt from t_access group by dt having dt>'20170804';
select
dt,count(*),max(ip) as cnt
from t_access
where url='http://www.edu360.cn/job'
group by dt having dt>'20170804';
注意: 一旦有group by子句,那么,在select子句中就不能有 (分组字段,聚合函数) 以外的字段
为什么where必须写在group by的前面,为什么group by后面的条件只能用having?
因为,where是用于在真正执行查询逻辑之前过滤数据用的,having是对group by聚合之后的结果进行再过滤;
上述语句的执行逻辑:
1、where过滤不满足条件的数据
2、用聚合函数和group by进行数据运算聚合,得到聚合结果
3、用having条件过滤掉聚合结果中不满足条件的数据