个人总结-Hive

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中)最后完成最终的聚合操作。

    原文作者:蠟筆小噺没有烦恼
    原文地址: https://www.jianshu.com/p/cc17a228617a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞