李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
19.Hive自定义UDF函数
Leefs
2021-12-15 PM
1202℃
0条
[TOC] ### 前言 本篇使用的版本是Hive 3.1.2。 ### 一、UDF函数简介 Hive中的用户自定义函数(即User Defined Function,简称UDF),是用户对一些列Hive操作进行封装以实现特定的功能的函数。 比如:在Hive的UDF中,可以直接使用select语句,对查询结果按照一定的格式输出。 UDF操作作用于单个数据行,并且产生一个数据行作为输出。**(一进一出)** UDF函数可以直接在方法列进行多层的嵌套使用。 ### 二、自定义UDF函数 #### 2.1 实现步骤 (1)创建Maven项目,引入Hive 3.1.2版本依赖; (2)创建自定义类,继承抽象类GenericUDF,重写抽象方法; (3)打成jar包上传到到服务器; (4)将jar包添加到 hive 的 classpath; (5)创建临时函数与开发好的java class关联; (6)在hql中使用自定义的函数。 #### 2.2 代码实现 > 需求:使用自定义UDF函数,计算指定字符串的长度 **(1)引入Hive依赖** ```xml
org.apache.hive
hive-exec
3.1.2
``` **(2)创建MyStringLength类,继承GenericUDF抽象类,重写抽象方法** ```java import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException; import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException; 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; /** * @author lilinchao * @date 2021/12/15 * @description 自定义UDF函数,需要继承GenericUDF类 * 需求: 计算指定字符串的长度 **/ public class MyStringLength extends GenericUDF { /** * @param objectInspectors 输入参数类型的鉴别器对象 * @return 返回值类型的鉴别器对象 * @throws UDFArgumentException */ @Override public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException { //判断输入参数的个数 if(objectInspectors.length != 1){ throw new UDFArgumentLengthException("Input Args Length Error!!!"); } //判断输入参数的类型 if(!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){ throw new UDFArgumentTypeException(0,"Input Args Type Error!!!"); } //函数本身返回值为int,需要返回int类型的鉴别器对象 return PrimitiveObjectInspectorFactory.javaIntObjectInspector; } /** * 函数的逻辑处理 * @param deferredObjects 输入的参数 * @return * @throws HiveException */ @Override public Object evaluate(DeferredObject[] deferredObjects) throws HiveException { if(deferredObjects[0].get() == null){ return 0; } return deferredObjects[0].get().toString().length(); } @Override public String getDisplayString(String[] strings) { return ""; } } ``` **抽象方法说明** + **initialize(ObjectInspector[] objectInspectors)** + 这个方法只调用一次,并且在evaluate()方法之前调用; + 该方法接受的参数是一个ObjectInspectors数组; + 该方法用于检查接受正确的参数类型和参数个数。 + **evaluate(DeferredObject[] deferredObjects)** + 该方法一般用于逻辑处理,它处理真实的参数,并返回最终结果。 + **getDisplayString(String[] strings)** + 这个方法用于当实现的GenericUDF出错的时候,打印出提示信息; + 提示信息就是实现该方法最后返回的字符串。 **(3)打成jar包上传到到服务器** **(4)将jar包添加到 hive的classpath** > 语法:add jar 【本地Jar包路径】; ```bash hive> add jar /home/hadoop/datas/hive_udf-1.0.jar; ``` **(5)创建临时函数与开发好的java class关联** > 语法:create temporary function 自定义方法名 as "主程序的全路径"; ```bash hive> create temporary function my_len as "com.lilinchao.hive.udf.MyStringLength"; ``` **(6)在hql中使用自定义的函数进行验证** ```sql hive> select my_len('abcdef'); +------+ | _c0 | +------+ | 6 | +------+ ``` **(7)临时函数其他操作** ```sql -- 显示UDF函数 show functions like my_len; -- 删除临时函数 drop temporaray function my_len; ``` #### 2.3 创建永久UDF **(1)在HDFS中创建相应目录,将hive_udf-1.0.jar包上传至该目录** ```shell #在HDFS中创建目录/user/hive_udf/ [hadoop@hadoop001 hadoop-3.2.1]$ hdfs dfs -mkdir /user/hive_udf/ #将hive_udf-1.0.jar包上传到HDFS的/user/hive_udf目录下 [hadoop@hadoop001 hadoop-3.2.1]$ hdfs dfs -put /home/hadoop/datas/hive_udf-1.0.jar /user/hive_udf ``` **(2)执行如下命令创建永久UDF** ```sql hive> create function my_len as 'com.lilinchao.hive.udf.MyStringLength' using jar 'hdfs://hadoop001:9000/user/hive_udf/hive_udf-1.0.jar'; drop function my_len; ``` **(3)重新进入Hive操作命令测试** ```sql 0: jdbc:hive2://hadoop001:10000> select my_len('abcdef'); +------+ | _c0 | +------+ | 6 | +------+ 1 row selected (1.085 seconds) ``` **(4)其他操作** ```sql -- 删除自定义永久UDF函数 drop function my_len; ```
标签:
Hadoop
,
Hive
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1747.html
上一篇
SparkSQL导入导出Excel文件
下一篇
【转载】scala spark创建DataFrame的多种方式
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
设计模式
锁
排序
数据结构和算法
查找
BurpSuite
机器学习
哈希表
稀疏数组
Http
微服务
Elastisearch
Sentinel
线程池
Tomcat
Flume
二叉树
Shiro
数学
Hadoop
Hive
随笔
MyBatis-Plus
MySQL
Python
Java编程思想
Spring
Jenkins
Nacos
Stream流
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞