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一起使用。