Hive知识点总结(三)

本文是Hive知识点系列的第三部分,主要聚焦于Hive的查询语法,包括1.2.0之后支持的不等值JOIN语法,以及如何使用left semi join替代不支持的exist/IN子查询。特别强调了在left semi join中select子句不能包含右表字段的限制。此外,文章还深入讲解了group by分组查询的要点。
摘要由CSDN通过智能技术生成

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条件过滤掉聚合结果中不满足条件的数据




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值