开发自定义UDF函数有两种方式:
一个是继承org.apache.hadoop.hive.ql.exec.UDF,
另一个是继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF;

UDF

使用UDF非常简单,只需要继承org.apache.hadoop.hive.ql.exec.UDF,并定义
public Object evaluate(Object args) {} 方法即可。
比如,下面的UDF函数实现了对一个String类型的字符串取HashMD5:

  1. package com.lxw1234.hive.udf;
  2. import org.apache.hadoop.hbase.util.Bytes;
  3. import org.apache.hadoop.hbase.util.MD5Hash;
  4. import org.apache.hadoop.hive.ql.exec.UDF;
  5. public class HashMd5 extends UDF {
  6. public String evaluate(String cookie) {
  7. return MD5Hash.getMD5AsHex(Bytes.toBytes(cookie));
  8. }
  9. }

将上面的HashMd5类打成jar包,udf.jar
使用时候,在Hive命令行执行:

  1. add jar file:///tmp/udf.jar;
  2. CREATE temporary function str_md5 as 'com.lxw1234.hive.udf.HashMd5';
  3. select str_md5(‘lxw1234.com’) from dual;

GenericUDF

继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF之后,需要重写几个重要的方法:
public void configure(MapredContext context) {}
//可选,该方法中可以通过context.getJobConf()获取job执行时候的Configuration;
//可以通过Configuration传递参数值
public ObjectInspector initialize(ObjectInspector[] arguments)
//必选,该方法用于函数初始化操作,并定义函数的返回值类型;
//比如,在该方法中可以初始化对象实例,初始化数据库链接,初始化读取文件等;
public Object evaluate(DeferredObject[] args){}
//必选,函数处理的核心方法,用途和UDF中的evaluate一样;
public String getDisplayString(String[] children)
//必选,显示函数的帮助信息
public void close(){}
//可选,map完成后,执行关闭操作

image.png
即在MapReduce阶段,GenericUDF几个方法的执行顺序为:
configure–>initialize–>evaluate–>close