Hive自定义UDF函数

在hive中,有时候一些内置的函数,和普通的查询操作已经满足不了我们要查询的要求,这时候可以自己写一些自定义函数来处理。自定义函数(user defined function =UDF)

由于hive本身是用java语言开发,所以udf必须用java来写才可以。

Hive中有三种UDF

  1. 普通udf(UDF)
    操作单个数据行,且产生一个数据作为输出。例如(数学函数,字符串函数)
  2. 聚合udf (UDAF)
    接受多个数据行,并产生一个数据行作为输出。例如(COUNT,MAX函数等)
  3. 表生成UDF(UDTF)
    接受一个数据行,然后返回产生多个数据行(一个表作为输出)。比如lateral view(据说是一个将行转成列的函数)。

编写UDF必须满足一下:

  1. 必须是org.apache.hadoop.hive.ql.exec.UDF的子类
  2. 必须实现evaluate函数。

下面展示如何编写一个普通的UDF

1、编写类,继承UDF类,重写evaluate方法

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.hadoop.hive.ql.exec.UDF;

public class TimeDiff extends UDF {
    
    public String evaluate(String endTime, String startTime, String format) {
        SimpleDateFormat dfs = new SimpleDateFormat(format);
        
        long diff = 0;
        Date end = null;
        Date start = null;
        try {
            end = dfs.parse(endTime);
            start = dfs.parse(startTime);
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
        
        diff = (end.getTime() - start.getTime());
        return Long.toString(diff);
    }
    
    public String evaluate(String endTime, String startTime) {
        String format = "yyyyMMdd";
        return evaluate(endTime, startTime, format);
    }
}

2、 打包后上传到客户端所在的目录

3、使用该函数前,需要执行以下两行命令:

ADD JAR /home/hadoop/hive/hive-udf.jar;

CREATE TEMPORARY FUNCTION time_diff AS 'cn.splus.hiveudf.dateutil.TimeDiff';

4、在sql中使用该函数

select year, time_diff(date1, date2) from table;  

你可能感兴趣的:(Hive自定义UDF函数)