程序笔记   发布时间:2022-07-19  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了HiveSQL常用(下篇:使用技巧与优化)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

很高兴遇到你~

(1)Hive常用日期格式处理

(2)Hive常用函数

(3)Hive常用语句(实用)

    @H_618_17@数据加载清理与建表 @H_618_17@表检索与表结构查询

(4)HiveSQL使用技巧与优化

(5)HiveSQL使用注意项

 

HiveSQL使用技巧与优化

SQL执行顺序:FROM->JOIN->WHERE->GROUP BY->HAVING->SELECT->ORDER BY->LIMIT

 

    @H_618_17@disTinct去重与count
--disTinct去重时,如果存在NULL,结果会异常,Hive不会将null值归为一个值处理,此时需要给NULL进行转换
SELEct disTinct nvl(column1,''),nvl(column2,0) from t;

--count(*)、count(1)对所有行进行统计,包括null行,count(column_Name)只对该列中非null的进行统计

--Hive中要避免使用COunt(disTinct),它无法进行聚合操作,只在一个reduce上完成,容易出现性能瓶颈甚至oom内存溢出,使用group by来替代
--count disTinct
SELEct col1,count(disTinct id) as did
from t
group by col1;
--使用group by优化替代
SELEct col1,count(id) as did
from(SELEct col1,id from t group by col1,id) as temp
group by col1;

 

    @H_618_17@subquerys子查询&exists/in&left semi join
--subquerys子查询:hive只支持from和where后的子查询--如果子查询中包含null值,不能使用Not in(not in会报错,in不会)--不推荐使用in/not in,可使用exists/not exists替代,支持子查询中的多值匹配
--not exists和left join可以有等价写法
--not exists
SELEct a,b
from t1
where not exists(SELEct 1 from t2 where t1.a=t2.a and t1.b=t2.b);

--等价not exists的left join写法
SELEct t1.a,t2.b
from t1
left join t2
on (t1.a=t2.a and t1.b=t2.b)
where t2.a is null;

--left semi join 替代 in和exists,效率更高
--LEFT SEMI JOIN(左半连接)是IN/EXISTS子句查询的一种更高效的实现
--LEFT SEMI JOIN 的限制是:JOIN 子句中右边的表只能在ON 子句中设置过滤条件,在WHERE 子句、SELECT 子句或其他地方过滤都不行
--LEFT SEMI JOIN 只会显示出左边表的字段,left semi join会掉右表中重复的记录,不会因为右表重复key join出多条
--in/exists
SELECT a.key, a.value
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
--left semi join替代in/exists
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)

 

    @H_618_17@sort by&diStribute by&cluster by&order by
--ORDER BY 全局排序,默认了reducer个数为1,只有一个Reduce任务,效率低下,如果对大数据集进行order by排序可能会造成性能瓶颈,造成reduce的时间非常长
--如果在Strict模式下使用order by语句,那么必须要在语句中加上limit关键字,因为执行order by只启动单个reduce,如果排序的结果集过大,那么执行时间会很久的原因
set hive.mapred.mode=nonStrict; (default value / 默认值)
set hive.mapred.mode=Strict;
--order by会引发全局排序,数据量较小order by即可(Hive中尽量不要使用order by,除非非常确定结果集非常小)
--实际场景中一般先使用sort by再使用order by效率更高一些,使用diStribute和sort进行分组排序,sort by+order by,sort by过程可以设置reducer个数(n),order by过程用n个reduce的输出文件进行一次全排序,得到最终结果
--sort by&diStribute by
--sort by只能保证在单个reduce内有序
SELEct * from baidu_click diStribute by product_line sort by click desc;
SELEct * from t diStribute by id sort by id;
--diStribute指定map输出结果是如何分配的,上句中相同的id会被分配到同一个reduce上去处理,然后再通过sort by对各个reduce上的id进行排序(被diStribute by设定的字段为KEY,数据会被HASH分发到不同的reducer机器上,然后sort by会对同一个reducer机器上的每组数据进行局部排序)
--cluster by(diStribute by + sort by替代方案)
--当diStribute by和sort by的字段完全一致时,等价于cluster by,但cluster by排序只能是升序排序,不能指定排序规则为ASC或者DESC
--cluster by 和 diStribute by 是很相似的,最大的不同是, cluster by 里含有一个分桶的方法
SELEct * from emp cluster by deptno;
SELEct * from emp diStribute by deptno sort by deptno; 

--常见两种高效的排序实现
--可先通过一个group by的子查询来取一个小的结果集,然后再对这个结果集进行全局排序
SELEct * from (
SELEct id,count(id) as cnt
from t
group by id) as temp
order by temp.cnt;

--高效实现top排序
--先取出各个结果集的top n,再取出全局的top n
SELEct a.id,salary
from (SELEct id,salary from t1 diStribute by sort by salary desc limit 10) as temp
order by temp.salary limit 10;

 

HiveSQL使用注意项

    @H_618_17@

    建表删除表使用if not exists/if exists防止异常;

    @H_618_17@

    分区字段不能出现在建表中,只能出现在partition by中;

    @H_618_17@

    使用具体列名避免使用SELEct *;

    @H_618_17@

    where 条件过滤时,!=、<>都会将null值过滤掉,导致实际结果集变小,如果需要保留null值:where (col1 <> 'value' or col1 is null)

    @H_618_17@

    group by时,SELEct的列别名不能被group by解析,group by后不能使用别名,因为hive执行解析严格按照SQL执行顺序,先group by,后SELEct

    @H_618_17@

    Hive不支持update操作,只能drop再insert

    @H_618_17@

    hive创建视图和其它数据库创建视图无异

    @H_618_17@

    hivE intString类型,null底层默认存储为N,查询显示为null,导出文件会以存储格式导出,需要注意。若导出为null,存储的字符串就是null字符串而非NULL值;SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是false.

    @H_618_17@

    分号是sql语句结束标记,在HiveQL中也是,但是在HiveSQL中,对分号的识别没有那么智慧,在DBeaver SQL IDE中也会出现因为加了;导致SQL报错的情况。另外字符';'使用需要转义,如:SELEct concat(key,concat(';',key)); 在Hive中会报错,应使用分号的八进制的ASCII码进行转义,应写成:SELEct concat(key,concat('73',key));

    @H_618_17@

    hive支持嵌入mapreduce程序,来处理复杂的逻辑,但一般不使用,为了维护方便,类似桶表一般也不使用

    @H_618_17@

    如何查看Hive的属性设置情况,如:set hive.mapred.mode; --hive.mapred.mode=nonStrict,要注意的是Strict模式也会限制分区表的查询,解决方案是必须指定分区

 

大佬总结

以上是大佬教程为你收集整理的HiveSQL常用(下篇:使用技巧与优化)全部内容,希望文章能够帮你解决HiveSQL常用(下篇:使用技巧与优化)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。