十一:UDF函数
自定义函数
之前使用hive自带函数sum/avg/max/min...
三种自定义函数:
UDF:一进一出(User-Defined-Function)
UDAF:多进一出 (count、max、min)
UDTF:一进多出
(1)导入hive依赖包 hive/lib下。编写自定义函数
(2)上传 alt+p
(3)添加到hive中 add jar /root/lower.jar;
(4)关联(注意是全类名)
create temporary function my_lower as "com.itstaredu.com.Lower";
(5) 使用
select ename,my_lower(ename) lowername from empt;
十二:hive优化
1:压缩
(1)开启Map阶段输出压缩
开启输出压缩功能:
set hive.exec.compress.intermediate=true;
开启map输出压缩功能:
set mapreduce.map.output.compress=true;
设置压缩方式:
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compres
s.SnappyCodec;
(2)开启reduce输出端压缩
开启最终输出压缩功能
set hive.exec.compress.output=true;
开启最终数据压缩功能
set mapreduce.output.fileoutputformat.compress=true;
设置压缩方式
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoo
p.io.compress.SnappyCodec;
设置块压缩
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
2:存储
https://blog.51cto.com/14284607/2381714这篇文章进行了hive的存储格式对比。我觉得写得很清楚!!
Hive存储格式:TextFile/SequenceFile/orc/Parquet
orc:Index Data/row Data/stripe Footer
压缩比:
orc > parquet > textFile
查询速度:
orc > textFile
50s > 54s
3:Group by优化
分组:mr程序,map阶段把相同key的数据分发给一个reduce,一个key的量很大。
解决方案:
在map端进行聚合(combiner)
set hive.map.aggr=true;
设置负载均衡
set hive.groupby.skewindata=true;
4:数据倾斜
(1)合理避免数据倾斜
合理设置map数
合并小文件
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
合理设置reduce数
(2)解决数据倾斜
在map端进行聚合(combiner)
set hive.map.aggr=true;
设置负载均衡
set hive.groupby.skewindata=true;
(3)JVM重用
mapred-site.xml
mapreduce.job.jvm.numtasks
10~20
来源:oschina
链接:https://my.oschina.net/u/4323253/blog/3527488