Hive编写UDF函数
Hive的内置函数无法满足业务需求时,就可以考虑使用用户自定义函数(UDF:user-defined function)
根据用户自定义的函数类别可以分为以下三种:
1.UDF(User-Defined-Function) 一进一出
UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
2.UDAF(User-Defined Aggregation Function) 聚集函数,多进一出 类似于:count/max/min
UDAF 接受多个输入数据行,并产生一个输出数据行。像COUNT和MAX这样的函数就是聚集函数。
3.UDTF(User-Defined Table-Generating Functions) 一进多出
UDTF 操作作用于单个数据行,并且产生多个数据行——-一个表作为输出。lateral view explore()
简单来说:
UDF:返回对应值,一对一
UDAF:返回聚类值,多对一
UDTF:返回拆分值,一对多
UDF
1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。
2、编写UDF函数的时候需要注意一下几点:
a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。
b)需要实现evaluate函数,evaluate函数支持重载。
例:写一个返回字符串长度的Demo:
1
2
3
4
5
6
7
8
9
10
11
12
import org.apache.hadoop.hive.ql.exec.UDF;
public class GetLength extends UDF{
@Override
public int evaluate(String str) {
try{
return str.length();
}catch(Exception e){
return -1;
}
}
}
3、步骤
a)把程序打包放到目标机器上去;
将打包好的jar包拖到hive安装目录下的lib目录当中
b)进入hive客户端,添加jar包:
hive> add jar /root/hive_udf.jar
c)创建临时函数:
hive> create temporary function getLen as 'com.raphael.len.GetLength';
d)查询HQL语句:
1 |
|
e)销毁临时函数:
hive> DROP TEMPORARY FUNCTION getLen;
UDAF
多行进一行出,如sum()、min(),用在group by时
1.必须继承
org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)
org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类Evaluator实现UDAFEvaluator接口)
2.Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
init():类似于构造函数,用于UDAF的初始化,实现接口UDAFEvaluator的init函数
iterate():接收传入的参数,并进行内部的轮转,返回boolean
terminatePartial():无参数,其为iterate函数轮转结束后,返回轮转数据,类似于hadoop的Combiner
merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
terminate():返回最终的聚集函数结果
1 |
|
3.执行求平均数函数的步骤
a)将java文件编译成Avg_test.jar。
b)进入hive客户端添加jar包:
hive>add jar /run/jar/Avg_test.jar
c)创建临时函数:
hive>create temporary function avg_test 'hive.udaf.Avg';
d)查询语句:
hive>select avg_test(scores.math) from scores;
e)销毁临时函数:
hive>drop temporary function avg_test;
4.总结
1、重载evaluate函数。
2、UDF函数中参数类型可以为Writable,也可为java中的基本数据对象。
3、UDF支持变长的参数。
4、Hive支持隐式类型转换。
5、客户端退出时,创建的临时函数自动销毁。
6、evaluate函数必须要返回类型值,空的话返回null,不能为void类型。
7、UDF是基于单条记录的列进行的计算操作,而UDFA则是用户自定义的聚类函数,是基于表的所有记录进行的计算操作。
8、UDF和UDAF都可以重载。
9、查看函数
SHOW FUNCTIONS;
UDTF
UDTF(User-Defined Table-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求
1.继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize, process, close三个方法。
UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。
初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward()调用产生一行;如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数。
最后close()方法调用,对需要清理的方法进行清理。
2.下面是一个用来切分”key:value;key:value;”这种字符串,返回结果为key, value两个字段。供参考:
1 |
|
3.使用方法
UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。
(1)直接select中使用
select explode_map(properties) as (col1,col2) from src;
不可以添加其他字段使用
select a, explode_map(properties) as (col1,col2) from src
不可以嵌套调用
select explode_map(explode_map(properties)) from src
不可以和group by/cluster by/distribute by/sort by一起使用
select explode_map(properties) as (col1,col2) from src group by col1, col2
(2)和lateral view一起使用
1 |
|
此方法更为方便日常使用。执行过程相当于单独执行了两次抽取,然后union到一个表里。
参考:
https://blog.csdn.net/weixin_43586713/article/details/120830699
觉得不错的话,支持一根棒棒糖吧 ୧(๑•̀⌄•́๑)૭
wechat pay
alipay