Hive与MapReduce相关排序及自定义UDF函数
原文链接:
https://www.toutiao.com/i6770870821809291788/
Hive和mapreduce相关的排序和运行的参数
1.设置每个reduce处理的数据量(单位是字节)
我们在hive中查看下
配置文件hive-site.xml.template
我们打开配置文件可以看到
这是256MB
如果超过1G,将使用4个reducers
2、设置最大运行的reduce的个数
同上我们可以在配置中找到下面的内容
复制到记事本里,简化了描述,从配置中我们可以看到默认reduce个数是1009
3.实际运行的reduce的个数
这个去哪里看呢?我们用之前执行过的reduce
访问8088端口,查看历史history
进入后在configuration中可以搜索到,可以看到我们的语句是否有reduce。
默认设置在hive中可以看到
如果我们使用下面的排序,是否reduce的数量有关系呢?
order by 全局排序
sort by:局部排序
distribute by (底层是MR分区)
cluster by:相当于distribute by + sort by组合使用
假如我们设置成3个
执行语句
select * from emp order by sal;
所以对于order by 全局排序,设置多个reduce的没有太大作用。
执行语句
Insert overwrite local directory '/data/hivetest/export_local_emp' select * from emp sort by sal desc;
查看结果,reduce是3个
生成文件
查看文件内容,可以看到每个都排序了
所以对于sort by 局部排序,设置多个reduce的是有作用的。
执行语句
insert overwrite local directory '/opt/hivetest/distribute_test' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from emp distribute by deptno sort by sal ;
我们查看文件
查看文件内容,都已经排序了
所以对于distribute by 局部排序,设置多个reduce的是有作用的。有两个注意的地方
(1)可以按照指定的字段进行分区
(2)先分区后排序,一般和sort by联合使用
执行语句
insert overwrite local directory '/data/hivetest/cluster_test' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' select * from emp cluster by sal ;
查看文件
查看内容
所以对于cluster by 局部排序,设置多个reduce的是有作用的,排序只能降序排序,不能指定排序规则
自定义函数(UDF)一进一出
实现一个功能,转换大小写,
首先创建一个maven项目
添加依赖
下面是依赖的主要内容
org.apache.hadoop
hadoop-client
2.7.3
org.apache.hive
hive-exec
1.2.1
org.apache.hive
hive-jdbc
1.2.1
创建一个类
编写代码
编写一个测试方法,测试代码
将写好的代码打成jar包,上传linx
一直点击下一步,其中注意主类的选择
将jar添加到hive里面去
add jar /data/hivetest/hive_udf.jar;
将包上传
我们进入hive,使用db_deptemp库
执行命令
list jars 和 delete jar 分别是显示jar和删除jar
创建临时函数
create temporary function convert_bl as 'com.xlglvc.xxx.mapredece.hiveudf.TestHiveUDF';
可以利用show functions查看函数
我们查看已有表的数据,可以看到很多大写的名字
执行我们的函数就可以了