Hive UDF、UDAF和UDTF函数
背景: Hive的自定义函数无法满足实际业务的需要,所以为了扩展性,Hive官方提供了自定义函数来实现需要的业务场景
1、定义
输入一行,输出一行
输入多行,输出一行
输入一行,输出多行
2、使用
(1)UDF开发和使用步骤
创建函数流程
a、自定义一个Java类
b、继承UDF类
c、重写evaluate方法
d、打成jar包
e、在hive执行add jar方法 (临时使用)
f、在hive执行创建模板函数
g、hql中使用
(2)UDAF开发和使用步骤
a、顶层UDAF类继承
org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator里面编写嵌套类evaluator实现UDAF的逻辑。
b、实现resolver :resolver负责类型检查,操作符重载
resolver通常继承
org.apache.hadoop.hive.ql.udf.GenericUDAFResolver2,但是更建议继承AbstractGenericUDAFResolver,
隔离将来hive接口的变化。
GenericUDAFResolver和GenericUDAFResolver2接口的区别是后面的允许evaluator实现可以访问更多的信息,
例如DISTINCT限定符,通配符FUNCTION(*)。
c、实现evaluator :evaluator真正实现UDAF的逻辑
所有evaluators必须继承抽象类
org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator。予类必须实现它的一些抽象方法,
实现UDAF的逻辑。
d、打成jar包
e、在hive执行add jar方法 (临时使用)
f、在hive执行创建模板函数
g、hql中使用
(3)UDTF开发和使用
a、 继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize, process, close三个方法。
b、UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。
c、初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward()调用产生一行;
如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数。
最后close()方法调用,对需要清理的方法进行清理。
d、打成jar包
e、在hive执行add jar方法 (临时使用)
f、在hive执行创建模板函数
g、hql中使用
注意:UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。