1、HQL脚本的三种执行方式:
Hive –e ‘hql执行一行脚本
Hive –f ‘hql.file’执行一个脚本文件
Hive jdbc代码执行脚本
2、UDF函数(输入1条数据,输出1条数据)
(1)Extends UDF,重写evaluate方法
(2)extends GenericUDF,重写initialize getDisplayString,evaluate方法
(3)临时添加udf
Addjar /home/work/udf.jar;
Createtemporary function mytest as ‘test.udf.ToLoverCase’;
3、UDAF函数(多对一)
Count聚合函数,Avg,min等
4、UDTF函数(一对多)
5、几种关键词的意义
(1)order by
会对输入做全局排序,因此只有一个reduce(多个的话无法保证全局有序),就会导致当前输入规模比较打的时候,需要较长的计算时间。Order by和关系型数据库的order by工呢个一致,按照某一项或几项排序输出。区别在于,如果hive中使用hive.mappred.mode=strict的模式,必须指出limit,否则会报错,因为所有数据都是在一个reduce中进行,数据量大的情况下会得不到结果,所以不许指定输出条数;
Eg:hive>select *from test order by id limit 100;
(2)sort by
Sort by不是全局排序,在进入reduce之前完成排序,如果还设置了mappred.reduce.tasks>1,则sortby智能保证每个reducer的输出有序,除非只有一个reduce,好处是执行了局部排序就可以为接下来的全局排序提高不少效率(在做一次归并排序就ok了)
(3)distribute by和sort by一起使用
Distribute by时空值map得输出在reducer中是如何划分的。按照指定的字段对数据进行划分到不同的输出reduce文件中
Eg:selectname,class,sex from student distribute by class sort by class asc,name asc;
那么所有class相同的数据会呗送到同一个reduce中u处理,就可以统计处每个商户各个班级中名称的顺序了(着肯定是全局有序的)因为相同的班级会放到同一个reduce中,但是distribute by必须要卸载sort by之前。
(4)cluster by
其实相当于distribute by和sort by相结合,一下两个语句等价
Eg:selectname,class,sex from student distribute by class sort by class asc
Eg:selectname,class,sex from student cluster by class asc
6、hive解决数据倾斜
Hive.groupby.skewindata=true
数据倾斜饿时候进行负载均衡,当选定为true时候,生成的查询计划会有两个mr job。第一个mr中map的输出结果集合会随机分布到Reduce中,每个Reduce都会做部分聚合操作,并输出结果,这样处理数据的结果是相同的group by key有可能被分发到不同的reduce中,从而达到负载均衡的目的;第二个mrjob再根据预处理的数据结果按照group by key分布到reduce中(这个过程可以保证相同的grou by key被分不到同一个reduce中)最后完成最终的聚合操作。