hive中开发、使用udf

简介: 我们在使用hive时难免会碰到hive的函数解决不了的操作,这时我们就可以开发UDF函数去解决复杂的问题

我们在使用hive时难免会碰到hive的函数解决不了的操作,这时我们就可以开发UDF函数去解决复杂的问题。

首先我们老生长谈一下udf函数分类:

UDF : User-Defined Function (用户自定义函数)一进一出
UDAF : User-Defined Aggregation Function(用户自定义聚合函数) 多进一出
UDTF : User-Defined Table-Generating Function(用户自定义表生成函数)一进多出

这里我们示例使用java来开发UDF函数,并上传到hdfs上,注册函数使用。

1、maven项目的pom.xml当中添加如下依赖:
<dependency>  
    <groupId>org.apache.hive</groupId> 
    <artifactId>hive-exec</artifactId>    
    <version>1.1.0-cdh5.14.2</version>
</dependency>

这里我使用的是cdh5.14.2的包,这里面会包括hadoop.io的数据类型的包,下面写的类型也是使用Text,尽量使用hadoop提供的数据类型,性能要比使用java的数据类型优,其次对于hive的array数据类型,java承接时需要使用ArrayList来使用。

2、开发一个udf函数并测试:

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


import java.util.ArrayList;


public class ArrayIntegrationUDF extends UDF {
    public ArrayList<Text> evaluate(ArrayList<Text> one, ArrayList<Text> two) {
        ArrayList<Text> lis = new ArrayList<>();
        int oneSize = one.size();
        int twoSize = two.size();
        // 如果one没有,则直接返回空数组,

        //one有一个,one有多个
        if (oneSize==1) {
            if (twoSize==0) {
                lis.add(one.get(0));
            } else {
                for (Text str : two) {
                    lis.add(new Text(one.get(0) + ";" + str));
                }
            }
        } else if (oneSize>1) {
            if (twoSize==0) {
                lis.addAll(one);
            } else {
                if (oneSize == twoSize) {
                    for (int i = 0; i < oneSize; i++) {
                        lis.add(new Text(one.get(i) + ";" + two.get(i)));
                    }
                } else if (oneSize > twoSize) {
                    for (int i = 0; i < oneSize; i++) {
                        if (i < twoSize) {
                            lis.add(new Text(one.get(i) + ";" + two.get(i)));
                        } else {
                            lis.add(one.get(i));
                        }
                    }
                } else {
                    for (int i = 0; i < twoSize; i++) {
                        if (i < oneSize) {
                            lis.add(new Text(one.get(i) + ";" + two.get(i)));
                        } else {
                            lis.add(new Text(one.get(oneSize-1) + ";" + two.get(i)));
                        }
                    }
                }
            }
        }

        return lis;
    }


}
3、打包、将打的jar包上传到hdfs上

hdfs上创建目录:hadoop fs -mkdir /user/hive/lib

上传jar包:hadoop fs -put /book/jar/book-udf-1.0-SNAPSHOT.jar /user/hive/lib
在这里插入图片描述
在这里插入图片描述

4、注册UDF函数

临时 : 只在当前hive窗口有效,窗口关闭,函数即被移除
永久 : 当前hive窗口关闭,重新打开也可以使用

临时

1.临时注册只要在客户端添加jar的即可,客户端可以是hiveshell、beeline、hue

hive> add jar /home/hadoop/lib/book-udf-1.0-SNAPSHOT.jar;
hue中ui界面可以上传jar包

2.创建临时方法语法: CREATE TEMPORARY FUNCTION 函数名 AS “自定义UDF函数类名”;
`
hive> CREATE TEMPORARY FUNCTION integration_array AS "com.medbook.assistant.ArrayIntegrationUDF";`

删除临时函数

hive> drop temporary function add_prefix; 
OK Time taken: 0.003 seconds
永久

hiveShell中执行
格式:
CREATE FUNCTION 函数名 AS “自定义UDF函数类名” USING JAR “jar包所在hdfs路径”;

CREATE FUNCTION integration_array AS "com.medbook.assistant.ArrayIntegrationUDF" USING JAR 'hdfs://bigdatanode01:8020/user/hive/lib/book-udf-1.0-SNAPSHOT.jar';

在这里插入图片描述

删除永久函数:

`
drop function 注册的函数名;`

目录
相关文章
|
7月前
|
SQL 存储 Java
Hive UDF UDTF UDAF 自定义函数详解
Hive UDF UDTF UDAF 自定义函数详解
128 2
Hive UDF UDTF UDAF 自定义函数详解
|
3月前
|
SQL JavaScript 前端开发
用Java来开发Hive应用
用Java来开发Hive应用
38 7
|
3月前
|
SQL JavaScript 前端开发
用Java、Python来开发Hive应用
用Java、Python来开发Hive应用
34 6
|
7月前
|
SQL 缓存 Java
Hive 之 UDF 运用(包会的)
Hive的UDF允许用户自定义数据处理函数,扩展其功能。`reflect()`函数通过Java反射调用JDK中的方法,如静态或实例方法。例如,调用`MathUtils.addNumbers()`进行加法运算。要创建自定义UDF,可以继承`GenericUDF`,实现`initialize`、`evaluate`和`getDisplayString`方法。在`initialize`中检查参数类型,在`evaluate`中执行业务逻辑。最后,打包项目成JAR,上传到HDFS,并在Hive中注册以供使用。
178 2
|
7月前
|
SQL Java 程序员
Hive反射函数的使用-程序员是怎么学UDF函数的
Hive反射函数的使用-程序员是怎么学UDF函数的
43 0
|
7月前
|
SQL Java 数据处理
【Hive】Hive的函数:UDF、UDAF、UDTF的区别?
【4月更文挑战第17天】【Hive】Hive的函数:UDF、UDAF、UDTF的区别?
|
7月前
|
SQL 消息中间件 Apache
Flink报错问题之使用hive udf函数报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
7月前
|
SQL 分布式计算 Java
Hive自定义函数UDF编写
Hive自定义函数UDF编写
87 2
|
7月前
|
SQL 搜索推荐 Java
Hive中的UDF是什么?请解释其作用和使用方法。
Hive中的UDF是什么?请解释其作用和使用方法。
93 0
|
7月前
|
存储 SQL JSON
大数据开发岗大厂面试30天冲刺 - 日积月累,每日五题【Day02】——Hive2
大数据开发岗大厂面试30天冲刺 - 日积月累,每日五题【Day02】——Hive2
59 0