李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
20.Hive自定义UDTF函数
Leefs
2021-12-17 PM
1641℃
0条
[TOC] ### 前言 之前已经介绍过自定义UDF函数,本篇将继续介绍自定义UDTF函数。 ### 一、简介 **UDTF:**即用户定义表生成函数(user-defined table-generating function),作用于单行数据,并且产生多个数据行。UDTF函数的输入与输出值是1:n的关系。 *UDTF(一进多出)* ### 二、自定义UDTF函数 **2.1 实现步骤** (1)引入依赖包; (2)创建自定义类,继承抽象类GenericUDTF; + 重写initialize方法 + 该方法的入参只有一个,类型是StructObjectInspector,从这里可以取得UDTF作用了几个字段,以及字段类型; + initialize的返回值是StructObjectInspector类型,UDTF生成的每个列的名称和类型都设置到返回值中; + 重写process方法 + 该方法中是一进多出的逻辑代码,把每个列的数据准备好放在数组中,执行一次forward方法,就是一行记录; + 重写close方法 + close方法不是必须的,如果业务逻辑执行完毕,可以将释放资源的代码放在这里执行。 (3)打成jar包上传到到服务器 (4)将jar包添加到 hive 的 classpath; (5)创建临时函数与开发好的java class关联; (6)在hql中使用自定义的函数。 **2.2 代码实现** > 需求:自定义一个 UDTF 实现将一个任意分割符的字符串切割成独立的单词 **(1)引入依赖** ```xml
org.apache.hive
hive-exec
3.1.2
``` **(2)创建MyUDTF类继承GenericUDTF类,重写抽象方法** ```scala import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import java.util.ArrayList; import java.util.List; /** * @author lilinchao * @date 2021/12/17 * @description 自定义一个UDTF实现将一个任意分割符的字符串切割成独立的单词 **/ public class MyUDTF extends GenericUDTF { private ArrayList
outList = new ArrayList
(); /** * initialize():在函数在GenericUDTF初始化时被调用一次,执行一些初始化操作 * 包括: * 1.判断函数参数个数 * 2.判断函数参数类型 * 3.确定函数返回值类型 */ @Override public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException { //1.定义输出数据的列名和类型 List
fieldNames = new ArrayList
(); List
fieldOIs = new ArrayList
(); //2.添加输出数据的列名和类型 fieldNames.add("lineToWord"); fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs); } /** * 核心方法,自定义UDTF的实现逻辑 * 代码实现步骤可以分为三部分: * 1.参数接收 * 2.自定义UDTF核心逻辑 * 3.输出结果 */ @Override public void process(Object[] objects) throws HiveException { //1.获取原始数据 String arg = objects[0].toString(); //2.获取数据传入的第二个参数,此处为分隔符 String splitKey = objects[1].toString(); //3.将原始数据按照传入的分隔符进行切分 String[] fields = arg.split(splitKey); //4.遍历切分后的结果,并写出 for(String field:fields){ //集合为复用的,首先清空集合 outList.clear(); //将每个单词添加至集合 outList.add(field); //将集合内容写出 forward(outList); } } /** * 没有其他输入行时,调用该函数 * 可以进行一些资源关闭处理等最终处理 */ @Override public void close() throws HiveException { } } ``` **(3)打成jar包上传到到服务器** **(4)将jar包添加到 hive的classpath** ```sql hive> add jar /home/hadoop/datas/hive_udtf-1.0.jar; ``` **(5)创建临时函数与开发好的 java class 关联** ```sql hive> create temporary function my_udtf as "com.lilinchao.hive.udtf.MyUDTF"; ``` **(6)使用自定义的函数** ```sql 0: jdbc:hive2://hadoop001:10000> select my_udtf("hello,world,hadoop,hive",","); +-------------+ | linetoword | +-------------+ | hello | | world | | hadoop | | hive | +-------------+ ``` ### 三、注意事项 在继承**GenericUDTF**后,其中 process()、close() 为 GenericUDTF 中的抽象方法,必须实现。 initialize() 虽然不是抽象方法,但必须**手动覆盖**实现该方法,因为 GenericUDTF 的 initialize() 最终会抛出一个异常: ```java throw new IllegalStateException("Should not be called directly"); ``` 需要覆盖实现的方法如下: ```java public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException { } ``` initialize() 在函数在 GenericUDTF 初始化时被调用一次,执行一些初始化操作,包括: 1. 判断函数参数个数 2. 判断函数参数类型 3. 确定函数返回值类型 *附参考文章链接:* *https://juejin.cn/post/6929326803748126733* *https://juejin.cn/post/6953753336537415687#comment*
标签:
Hadoop
,
Hive
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1749.html
上一篇
【转载】scala spark创建DataFrame的多种方式
下一篇
21.Hive案例实操
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
nginx
Scala
Beego
MyBatisX
SQL练习题
Git
Spark RDD
队列
Golang基础
Hive
BurpSuite
工具
SpringCloudAlibaba
ClickHouse
Filter
Tomcat
Java阻塞队列
并发线程
MyBatis
RSA加解密
GET和POST
哈希表
数学
机器学习
Kibana
Azkaban
MySQL
Shiro
Java编程思想
FileBeat
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭