Hive-编写UDF函数(详细教程~~~)

article/2025/9/27 0:35:07

编写UDF函数

    • (1)创建项目:
    • (2)导入依赖:
    • (3)继承UDF类
    • (4)业务代码
    • (5)打包编译
    • (5)添加到hive类路径
    • (6)创建临时函数
    • (7)使用测试

Hive 自带了一些函数,比如:max/min 等,但是数量有限,自己可以通过自定义 UDF 来 方便的扩展。
2)当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义 函数(UDF:user-defined function)。
3)根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function) 一进一出
(2)UDAF(User-Defined Aggregation Function) 聚集函数,多进一出 类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions) 一进多出
如 lateral view explode()

接下来我们自己动手编写一个UDF函数:

(1)创建项目:

启动IDEA,创建MAVEN项目,命名为:com.atguigu,删除src模块,自己创建一个模块,在项目上右键New Module,生成子父模块,名字叫做hive-demo,接着创建packet:com.atguigu.udf:创建MyUDF类:

在这里插入图片描述

(2)导入依赖:

点进子模块hive-demo的pom.xml的文件,添加hive的依赖:

    <artifactId>hive-demo</artifactId><version>1.0-SNAPSHOT</version><!-- 声明并引入,所有子模块都会自动引入该依赖--><dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.2</version></dependency></dependencies>

总的依赖如图所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>project-200821</artifactId><groupId>com.atguigu</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>hive-demo</artifactId><version>1.0-SNAPSHOT</version><!-- 声明并引入,所有子模块都会自动引入该依赖--><dependencies><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.2</version></dependency></dependencies>
</project>

(3)继承UDF类

在创建好的MyUDF类中,继承GenericUDF,同时实现方法:

package com.atguigu.udf;import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;public class MyUDF extends GenericUDF {public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {return null;}public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {return null;}public String getDisplayString(String[] strings) {return null;}
}

这里面有三个方法,一个是初始化,一个是执行计算,最后一个方法是返回一个strung,其中,最后一个方法的意思是去获取执行计划的顺序,一般就返回一个" "就行.

(4)业务代码

编写求字符串长度的代码:

package com.atguigu.udf;import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;public class MyUDF extends GenericUDF {//合法性校验public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {if(arguments.length!=1){throw new UDFArgumentException("参数个数不为1");}return PrimitiveObjectInspectorFactory.javaIntObjectInspector;}//处理数据public Object evaluate(DeferredObject[] arguments) throws HiveException {String input = arguments[0].get().toString();if(input==null){return 0;}return input.length();}public String getDisplayString(String[] children) {return "";}
}

(5)打包编译

编写好,点击Maven,packet打包:
在这里插入图片描述
出现下面的界面,build success:
在这里插入图片描述
找到jar包的位置:
在这里插入图片描述
将打包好的jar包拖到hive安装目录下的lib目录当中,期间遇到错误,传输失败,查看说明permission is not allowed,权限不够,于是我把hive下面的lib目录直接改成chmod 777 lib:
在这里插入图片描述

(5)添加到hive类路径

将jar包添加到hive的classpath:

hive (default)> add jar /opt/module/hive/lib/hive-demo-1.0-SNAPSHOT.jar;
Added [/opt/module/hive/lib/hive-demo-1.0-SNAPSHOT.jar] to class path
Added resources: [/opt/module/hive/lib/hive-demo-1.0-SNAPSHOT.jar]

(6)创建临时函数

创建临时函数与开发好的java class进行关联:

hive (default)> create temporary function my_len as "com.atguigu.udf.MyUDF";
OK
Time taken: 0.271 seconds

(7)使用测试

使用udf函数:

hive (default)> select my_len('zhang') ;
OK
_c0
5
Time taken: 0.229 seconds, Fetched: 1 row(s)hive (default)> select my_len('') ;
OK
_c0
0
Time taken: 0.335 seconds, Fetched: 1 row(s)

这样的话,就求出了我们的字符串的长度。


http://chatgpt.dhexx.cn/article/8PspyWRu.shtml

相关文章

关于Mysql中UDF函数的思考(一)

一点背景 从大学二年纪接触编程&#xff0c;几乎我阅读过的所有的编程语言教材都会有那么一章专门讲述数据库编程&#xff0c;而讲述的内容都无非是介绍某个数据库历史&#xff0c;对应的安装过程&#xff0c;最后才会讲解一点SQL语句&#xff0c;像这样的教材我个人认为是完全…

UDF、UDAF、UDTF之间的区别

1、UDF&#xff1a;用户定义&#xff08;普通&#xff09;函数&#xff0c;只对单行数值产生作用&#xff1b; 继承UDF类&#xff0c;添加方法 evaluate() /*** function 自定义UDF统计最小值**/public class Min extends UDF {public Double evaluate(Double a, Double b) {i…

HIVE udf、udaf、udtf函数定义与用法(最全!!!!!)

一、定义 1、hive udf、udaf、udtf函数定义与用法 &#xff08;1&#xff09;UDF&#xff08;user-defined function&#xff09;作用于单个数据行&#xff0c;产生一个数据行作为输出。&#xff08;数学函数&#xff0c;字符串函数&#xff09; &#xff08;2&#xff09;U…

udf,udaf,udtf之间的区别

1、UDF&#xff1a;用户定义&#xff08;普通&#xff09;函数&#xff0c;只对单行数值产生作用&#xff1b; 继承UDF类&#xff0c;添加方法 evaluate() /*** function 自定义UDF统计最小值* author John**/public class Min extends UDF {public Double evaluate(Double a…

如何编写udf函数(收藏篇)

hive自带了一些函数&#xff0c;比如&#xff1a;max、min 等&#xff0c;但是自带的函数数量有限&#xff0c;所以hive提供给用户自定义函数的功能。 udf 函数可以直接应用于select 语句&#xff0c;对查询结构做格式化处理之后&#xff0c;然后再输出内容。 下面将详细介绍下…

自定义UDF函数

自定义函数案例&#xff1a; 文章目录 自定义UDF函数1.需求2.前期maven工程准备3.编程实现4.导包5.导入hive中 自定义UDTF函数1.需求2.编程实现3.导入hive中 自定义UDF函数 1.需求 自定义一个UDF实现计算给定字符串的长度例如 2.前期maven工程准备 创建一个maven工程&#x…

Hive自定义UDF函数详解

Hive自定义UDF函数详解 一、UDF概述二、UDF种类三、如何自定义UDF四、自定义实现UDF和UDTF4.1 需求4.2 项目pom文件4.3 Hive建表测试及数据4.4 UDF函数编写4.5 UDTF函数编写4.6 UDTF使用 一、UDF概述 UDF全称&#xff1a;User-Defined Functions&#xff0c;即用户自定义函数&…

Hive UDF简单函数

概念 在Hive中&#xff0c;用户可以自定义一些函数&#xff0c;用于扩展HiveQL的功能&#xff0c;而这类函数叫做UDF&#xff08;用户自定义函数)。UDF分为两大类&#xff1a;UDAF&#xff08;用户自定义聚合函数&#xff09;和UDTF&#xff08;用户自定义表生成函数)。  UDF…

大数据Hive篇--UDF函数

什么是UDF: 它是User defined Function的简写&#xff0c;意思是用户自定义方法 为什么要用UDF&#xff1f; hive自带了一些函数&#xff0c;比如&#xff1a;max、min 等&#xff0c;但是自带的函数数量有限&#xff0c;所以hive提供给用户自定义函数的功能。 udf 函数可以…

《C#入门详解》刘铁猛——Lesson20-21事件

其实事件一般就是在界面程序中应用&#xff0c;所以这里讲的不如WPF这种的实用。

《C#入门详解》刘铁猛——Lesson1-2 IDE、各种应用程序

编程学习路径&#xff1a;语言——类库——框架 参考资料&#xff1a;离线MSDN文档&#xff0c;C#语言定义文档&#xff0c;推荐书籍—C# in a nutshell&#xff1b;其中&#xff0c;C#语言定义文档知识点会串的比较多&#xff0c;不建议详读。 使用MSDN&#xff1a;光标选中…

《C#入门详解》刘铁猛——Lesson8-9 方法的定义、调用与调试

方法命名&#xff1a;使用动词或者动词短语&#xff1b;使用PASCAL规则&#xff0c;即所有单词首字母大写。 静态类型的方法不是实例的方法&#xff0c;是类的方法&#xff0c;因此&#xff0c;实例不能调用静态方法&#xff0c;只能用类调用静态方法&#xff0c;示例程序如下&…

《C#入门详解》刘铁猛——Lesson17字段、属性、索引器、常量

属性代码示例&#xff1a; 以上代码演示了字段由get-set方法对演化成为属性的过程。 prop连敲两下Tab键&#xff0c;是属性声明的快捷键。 强调以下&#xff1a; 很少使用索引器。 声明和使用常量&#xff1a;

《C#入门详解》刘铁猛——Lesson27-28类的重写、多态、抽象类、开闭原则

重写、多态——子类对父类的纵向扩展&#xff0c;就是方法的版本升级。 override——重写&#xff0c;子类对父类成员的版本更新。 virtual——override 下面的例子就是多态——多态就是使用一个父类的变量引用一个子类的实例&#xff0c;当调用方法时&#xff0c;会顺着继承链…

《C#入门详解》刘铁猛——Lesson19委托

自定义委托类型&#xff1a; 模板方法实例&#xff1a; 回调方法示例&#xff1a; 多播委托示例&#xff1a; 同步调用&#xff08;串行&#xff0c;单线程&#xff09;示例&#xff1a; 多播委托也是同步调用&#xff1a; 隐式的异步调用示例&#xff1a; 执行结果发生了资源…

《C#入门详解》刘铁猛——Lesson18传值\输出\引用\数组\具名\可选参数、扩展方法

x是101&#xff0c;y是100 在声明函数的时候带有默认值。 静态函数&#xff0c;第一个参数加this修饰符&#xff0c;就是一个扩展方法。调用的时候可以看见向下的小箭头。

刘铁猛C#语言入门详解——学习笔记014、15、16(2)

using System; using System.Collections.Generic; namespace ConsoleApp2 {class Program{static void Main(string[] args){//c#语言对表达式的定义&#xff1a;a sequence of one or more operands and zero or more operators can be evaluated to a single value object m…

《深入浅出WPF》-刘铁猛学习笔记——XAML

这里有个目录 XAML是什么&#xff1f;导人程序集和引用其中的名称空间XAML的树型结构Attribute (特性、标记、属性)Property (属性)属性赋值字符串赋值使用属性元素( Property Element)进行复杂赋值 XAML 注释后记 XAML是什么&#xff1f; XAML是微软公司创造的一种开发语言&a…

《C#入门详解》刘铁猛——Lesson31泛型、partial类、枚举、结构体

泛型类如下&#xff1a; 泛型接口&#xff0c;太常用了&#xff0c;如下&#xff1a; 实现这个泛型接口的类&#xff0c;也是泛型类&#xff0c;如下&#xff1a; 数据结构&#xff0c;基本上都是泛型的。 方法也可以是泛型的&#xff0c;而且泛型方法更常用&#xff0c;泛型方…