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查看函数

我们查看已有表的数据,可以看到很多大写的名字

执行我们的函数就可以了

 

posted on 2020-03-20 23:09  那山的狐狸  阅读(499)  评论(0编辑  收藏  举报

导航