李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
19.Hive自定义UDF函数
Leefs
2021-12-15 PM
1740℃
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
NLP
4
标签云
Ubuntu
CentOS
Jenkins
Jquery
Git
Linux
Map
Flume
Java编程思想
二叉树
LeetCode刷题
并发线程
Typora
Spark Streaming
排序
设计模式
pytorch
Shiro
Spark RDD
JVM
FastDFS
线程池
人工智能
数学
Beego
并发编程
国产数据库改造
HDFS
Docker
JavaScript
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭