udf,udtf,udaf

UDF(User-Defined-Function)                   一进一出

UDAF(User- Defined Aggregation Funcation)         多进一出 (聚合函数,MR)

UDTF(User-Defined Table-Generating Functions)         一进多出 (生成多行结果)

UDF

  1.注意事项

    a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。

    b)需要实现evaluate函。

    c)evaluate函数支持重载。

UDAF

  1.注意事项

   a)导入以下两个包:

    import org.apache.hadoop.hive.ql.exec.UDAF

    import org.apache.hadoop.hive.ql.exec.UDAFEvaluator

  b)函数类需要继承UDAF类,内部类Evaluator实UDAFEvaluator接口

  c )Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数 :

    1)init函数实现接口UDAFEvaluator的init函数。

    2)iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean。

    3)terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial类似于hadoop的Combiner。

    4)merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。

    5)terminate返回最终的聚集函数结果。

  2.Mode对应的各阶段方法    

  1. (1)PARTIAL1 - Map阶段
  2. iterate()和terminatePartial()
  3. (2)PARTIAL2 - Map合并阶段
  4. merge()和terminatePartial()
  5. (3)FINAL - Reduce阶段
  6. merge()和terminate()
  7. (4)COMPLETE - Reduce阶段时执行
  8. iterate()和terminate()

UDTF

  1.注意事项

    a)继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF。

    b)实现initialize, process, close三个方法

  2.用法

    a)直接select中使用:select explode_map(properties) as (col1,col2) from src;

    b)和lateral view一起使用:select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;

UDF在易数平台中的实践

Hive执行

hive-jdbc 模式

  1. 将udf.jar包上传到项目hdfs中 image-20201119224217164
  1. 先add jar (HDFS全路径:hdfs://hz-clusterx/xxx/udf.jar),再创建udf image-20201119224237482

hive-client 模式

  1. 将udf.jar包上传到项目任务资源中 image-20201119224319278

    image-20201119224325937

  2. 先add jar (jar包相对路径 ./udf.jar),再创建udf image-20201119224403746