发现自己在hive查询的时候,总是习惯用比较常用的语句,像在进行分组后的过滤会首先用到的是把前一过滤后的数据作为一张子表,而忘记了haveing的用法,这样查询语句显得不够简洁,同时也会降低查询性能。要多用用其他的查询语句,做做对比,这样在写代码的时候可以尽量的简洁一些,不要只是会用比较常见的语句。
——having
having语句用于在group by中对每组数据进行where条件限制
having作用在分组(group by)之后,对分组后的计算数组进行过滤,where是作用在分组(group by)之前
示例:输出 user_action_202003 中城市编号为5000,日期为3月4日,且点击次数少于6次的用户卡号和点击次数
select userid as xuserid,count(*) as count
from user_action_202003
where day="4" and city="5000"
group by userid
having count(*)<= 6
——substring(substr用法一样)
用法:substr(string A, int start, int len)
我在查询字符串匹配的时候,用的是正则表达regexp,就会遇到一个问题,比如在xxx,xxx第二季,想查询xxx的数据的时候,用regexp xxx进行过滤的时候,会把xxx第二季也过滤出来,substring好像稍微可以解决一下这个问题。
![](https://img.haomeiwen.com/i22530756/c00f8266dd9022fb.png)
示例1:想输出熊熊乐园01和熊熊乐园02
1、SELECT * FROM Table2 WHERE NAME REGEXP '熊熊乐园'; (会全部输出)
2、SELECT * FROM Table2 WHERE SUBSTRING(NAME,-6,4)='熊熊乐园' ; (只输出熊熊乐园01和熊熊乐园02)
示例2:和order by一起使用
输出 user_action_202003 中城市编号为5000,日期为3月4日,且点击次数少于6次的卡号用户对应的用户行为数据(输出左表)
select * from user_action_202003 y
left semi join
(select userid as xuserid,count(*) as count
from user_action_202003
where day="4"
and city="5000"
group by userid
having count(*)<= 6 ) x
on y.userid=x.xuserid
where y.day="4"
order by y.userid,substring(y.action,1,20);
order by 后面跟的是排序规则,先按卡号进行排序,在对 y.action 字段的前20字符(即时间)进行排序,默认是升序(asc)
![](https://img.haomeiwen.com/i22530756/d88b8a5998235bf5.png)
ps:有时候建立重复结构的表时可以用 like 来建立,这样可以不用再写一次字段了,简洁方便很多了,对于导入文本数据时想跳过第一行可以在创建表的时候在命令最后一行添加下面的语句:
>create external table if not exists assetinfo_202002 like assetinfo_202001 row format delimited fields terminated by '\t' location '/opt/hive/assetinfo/assetinfo_202002'
> tblproperties("skip.header.line.count"="1");
网友评论