hive自定义函数UDF案例

一·定义一个可以通过指定格式字符串变成map,然后通过第二个参数作为key,返回key对应的value的方法getValue
示例:

name=zhangsan&age=18&habits=eat

package programmer.homework.day07.work.complex.map;

import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.HashMap;
import java.util.Map;

@Description (name = "getValue",value = "get the value of the key",extended = "Extended: get the value of the key")
public class GetValueUDF extends UDF {
	//定义一个Map类型的属性,用于接收解析出来的键和值
    Map<String,String> infos = new HashMap<>();
    
    /**
    hive在执行函数的时候会调用下面的方法
    */
    public String evaluate(String info,String key){
        String[] splits = info.split("&");
        for(String s : splits){
            String[] keyValues = s.split("=");
            infos.put(keyValues[0],keyValues[1]);
        }
        return infos.get(key);
    }

    /**
     * 写个main方法用于测试代码逻辑
     */
    public static void main(String[] args) {
        String s = "name=zhangsan&age=18&habits=eat";
        GetValueUDF getValueUDF = new GetValueUDF();
        System.out.println(getValueUDF.evaluate(s,"name"));
    }
}

执行以上自定义函数的步骤
①在idea中用maven打成jar包
②将jar包上传到linux的某个目录下,比如/usr/local/hive/jar/xxx.jar
③进入hive客户端,将jar包添加到class Path路径下,即执行命令
add jar /usr/local/hive/jar/xxx.jar;
④在当前session创建一个临时函数:

create temporary function getValue as '自定义类的包名.类名';

⑤使用select 执行函数

select getValue('name=zhangsan&age=18&habits=eat','name');  -- 返回zhangsan

二.定义一个函数可以通过字符串表现形式的出生日期返回年龄

package programmer.homework.day07.work.complex.birth2;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class AgeUDF extends UDF {
    private IntWritable age = new IntWritable();

    public static void main(String[] args) {
        AgeUDF ageUDF = new AgeUDF();
        System.out.println(ageUDF.evaluate(new Text("2012-01-12")));

    }
    public IntWritable evaluate(Text date){
        java.util.Date dateTime = null;
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            dateTime = simpleDateFormat.parse(date.toString());
            Calendar calendar = Calendar.getInstance();
            //当前时间的年月日
            int nowYear = calendar.get(Calendar.YEAR);
            int nowMonth = calendar.get(Calendar.MONTH);
            int nowDay = calendar.get(Calendar.DAY_OF_MONTH);
            //将Calendar对象的时间设置为指定的出生日期
            calendar.setTime(dateTime);
            //出生日期的年月日
            int birthYear = calendar.get(Calendar.YEAR);
            int birthMonth = calendar.get(Calendar.MONTH);
            int birthDay = calendar.get(Calendar.DAY_OF_MONTH);
            //年龄
            int yearDiff = nowYear - birthYear;
            //根据具体的当前时间的月和日判断是否过了生日
            if(nowMonth > birthMonth){
                age.set(yearDiff + 1);
                return age;
            }
            if(nowMonth == birthMonth){
                if(nowDay >= birthDay){
                    age.set(yearDiff + 1);
                    return age;
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return age;
    }
}

在hive客户端执行以上自定义函数:

-- 添加jar包到class Path路径下
add jar /usr/local/hive/jar/getage.jar;
-- 在当前session创建临时函数 getage
create temporary function getage as 'programmer.homework.day07.work.complex.birth2.AgeUDF';
-- 使用该函数
select getage('2012-12-12');  //返回年龄
-- 方法的参数可以是hive表中的一个字段,birthday是出生日期的字段名,student是表名
select birthday,getage(birthday) as age from student; -- 可以看到左边一列是出生日期,右边一列是年龄  

hive中自定义函数的加载方式
三种方式第一步都是把打好的jar包上传到linux服务器上,jar包的名称如果不好记,可以改个名
①方式一,纯命令
在hive客户端中依次输入以下命令:

add jar jar包绝对路径;
create temporary function functionName as '定义的函数的类全限定名';
-- 查看临时函数是否创建成功,能看到自己定义的函数说明创建成功,注意创建的函数只在当前shell窗口有效
show functions; 

②方式二,启动参数加载

-- 进入linux中的hive目录下(此时不是在hive客户端中)
cd /usr/local/hive;
vi ./hive-init;
-- 在hive-init文件中添加以下两个命令
add jar jar包的路径;
create temporary function functionName as '定义方法的类的全限定名';
-- wq保存后退出,执行以下命令,在启动hive客户端的同时,初始化hive-init文件
hive -i ./hive-init;

③方式三,配置文件加载,通过这种方式,只要启动hive,就会加载这个函数

-- 进入linux系统中的hive目录下(此时不是在hive客户端中)
cd /usr/local/hive;
-- 进入./bin/.hiverc文件,即使没有会创建,加入两句命令
add jar jar包的路径;
create temporary function functionName as '定义方法的类的全限定名';
-- 启动hive
hive
### Hive 自定义函数的创建与使用 #### 创建自定义函数 Hive 提供了强大的功能允许用户通过自定义函数UDF, User Defined Function)扩展其能力。以下是关于如何创建和使用的详细介绍。 1. **继承 `org.apache.hadoop.hive.ql.exec.UDF`** 用户需新建 Java 工程并引入 Hive 的相关依赖库[^2]。在此基础上,创建一个新的类并让该类继承 `org.apache.hadoop.hive.ql.exec.UDF` 类。这是构建 UDF 的基础步骤之一。 2. **实现 `evaluate` 方法** 继承后的主要工作在于实现 `evaluate` 方法。此方法可以被重载以适应不同的输入参数类型,并返回相应的计算结果。例如,在一个简单的字符串转换案例中,如下所示: ```java import org.apache.hadoop.hive.ql.exec.UDF; public class ToUpper extends UDF { public String evaluate(String str) { if (str == null) { return null; } return str.toUpperCase(); } } ``` 3. **打包与部署** 将编写的代码打包成 JAR 文件,并将其上传至目标 Linux 系统环境中的适当位置。注意,JAR 包不应包含 Hive 的原生 JAR 文件以免引起冲突[^2]。 4. **加载 JAR 并注册函数** 在 Hive 命令行界面执行以下操作完成 UDF 注册过程: - 加载外部 JAR 文件: ```sql ADD JAR /path/to/your/custom_udf.jar; ``` - 定义临时函数名称映射到具体类路径: ```sql CREATE TEMPORARY FUNCTION to_upper AS 'com.example.ToUpper'; ``` 5. **调用自定义函数** 函数一旦成功注册即可像其他内置函数一样在 HQL 查询语句里直接调用了。例如: ```sql SELECT to_upper(column_name) FROM table_name; ``` #### 不同类型的自定义函数及其特点 除了普通的 UDF 外还有两种特殊形式——聚合型 UDAF 和表生成器型 UDTF: - **UDAFFormat**: 这种用于统计分析场景下的多值输入单值输出需求,如求平均数、计数等功能。 - **UDTFFormat**: 主要应用于单一记录拆分成多个子记录的情况,比如解析 JSON 字符串字段为独立列数据结构。 以上便是有关于如何在 Hive 中创建以及运用各种类型自定义函数的整体流程说明[^1]. ```python def example_hive_query(): query = """ ADD JAR /usr/local/hive/lib/my_custom_udfs.jar; CREATE TEMPORARY FUNCTION custom_length AS 'com.mycompany.CustomLengthUDF'; -- Example usage of the newly created UDF. SELECT id, name, custom_length(name) AS length_of_name FROM employees; """ return query ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值