← 返回首页
UDF函数
发表时间:2023-07-01 10:14:49
Hive实现自定义函数

UDF函数可以直接应用于select语句,对查询结构做格式化处理输出内容。自定义UDF需要继承org.apache.hadoop.hive.ql.UDF,实现evaluate函数。

实例:使用UDF实现自定义生日转年龄的函数。

实现步骤如下:

1.在pom.xml中添加依赖

<properties>
  ...
  <hive.version>3.1.3</hive.version>
  <hadoop.version>3.1.3</hadoop.version>
</properties>

<dependencies>
   ...
   <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>${hive.version}</version>
   </dependency>

   <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>${hadoop.version}</version>
   </dependency>
</dependencies>

2.创建自定义函数实现类

package com.example.hivedemo.udf;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.Calendar;

public class Birthday2Age extends UDF {
    public int evaluate(String birth) {
        if (StringUtils.isEmpty(birth)) return -1;
        //1.输入年月日
        String[] ymd = birth.split("-");
        int year = Integer.parseInt(ymd[0]);
        int month = Integer.parseInt(ymd[1]);
        int day = Integer.parseInt(ymd[2]);
        //2.当前的日期
        Calendar calendar = Calendar.getInstance();
        int currentYear = calendar.get(Calendar.YEAR);
        int currentMonth = calendar.get(Calendar.MONTH);
        int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
        //3.计算年龄
        int age = currentYear - year;
        if (currentMonth < month) age = age - 1;
        else if (currentMonth == month && currentDay < day) age = age - 1;
        return age;
    }
}

3.打成jar包上传

hdfs dfs -put /root/test/hivedemo.jar /commons/jars/

如果是maven项目打包时出现以下异常:

maven thread "main" java.lang.StackOverflowError
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:481)

给maven添加参数即可。

4.创建自定义函数

create function my_birth2age as 'com.example.hivedemo.udf.Birthday2Age' using jar 'hdfs://hadoop-master:9000/commons/jars/hivedemo.jar'

5.测试自定义函数

hive> select my_birth2age('2017-06-25');
OK
5
Time taken: 0.173 seconds, Fetched: 1 row(s)

注意:hive的show functions命令不能显示出来自定义的函数,但是原数据的funcs表里面可以查看到。