美文网首页
Hive自定义UDF函数

Hive自定义UDF函数

作者: yannhuang | 来源:发表于2017-11-27 17:05 被阅读167次

    在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函数

          本文链接:https://www.haomeiwen.com/subject/uvudbxtx.html