李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
20.Hive自定义UDTF函数
Leefs
2021-12-17 PM
2039℃
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://www.lilinchao.com/archives/1749.html
上一篇
【转载】scala spark创建DataFrame的多种方式
下一篇
21.Hive案例实操
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
35
其它
25
GO
48
NLP
8
标签云
Jquery
RSA加解密
Kibana
数据结构和算法
DataWarehouse
MySQL
Java工具类
Spark SQL
高并发
ajax
哈希表
Kubernetes
Git
Golang
Sentinel
并发线程
国产数据库改造
Kafka
Spark Core
Flume
递归
gorm
机器学习
Elastisearch
Stream流
并发编程
栈
nginx
MyBatisX
Python
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞