自定义UDF函数和UDTF函数
文章目录
- 1.创建maven项目,引入依赖
- 2.自定义函数
- 自定义UDF函数
- 自定义UDTF函数
- hive调用jar包创造函数
- 方法1:上传到linux下导入hive
- 方法2:上传到hdfs上再导入hive
- 测试
- 问题:
1.创建maven项目,引入依赖
pom.xml
在pom.xml文件中添加如下内容
<properties><project.build.sourceEncoding>UTF8</project.build.sourceEncoding><hive.version>1.2.1</hive.version>
</properties><dependencies><!--添加hive依赖--><dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>${hive.version}</version></dependency>
</dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>
2.自定义函数
自定义UDF函数
- extends UDF
- 编写evaluate(自己写,并不是重写,因为返回类型还有参数都靠自己定义)
这里主要是为了学习如何自定义UDF,就简单设计函数了:返回值跟参数无关,直接返回一个1
package com.jc.mytest.myudf;import org.apache.hadoop.hive.ql.exec.UDF;public class MyUDF extends UDF {public Integer evaluate(String str){return 1;}//main函数用于测试public static void main(String[] args) {Integer result = new MyUDF().evaluate("test");System.out.println(result);}
}
自定义UDTF函数
extends genericUDTF
编写initialize,process,close函数(它们三个都是重写父类的)
initialize函数里面用到的那个类名是在太难看了,不写这个方法可以吗?
关于process函数,它没有返回值,参数是一个Object[]数组,传入的多个数据在该数组中
package com.jc.mytest.myudtf;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 java.util.ArrayList;/*** UDTF函数:1进多出* 这里主要是为了练习自定义UDTF函数,随便传入一string类型,返回两行两列数据,类型分别为string和Integer* 返回2个int,1 2,2个string a b*/
public class MyUDTF extends GenericUDTF {/*** initialize方法中用到的类名真是让人头大。* @param argOIs* @return* @throws UDFArgumentException*/@Overridepublic StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {//存储返回的数据的列名ArrayList<String> fieldNames = new ArrayList<>();fieldNames.add("c1"); //我们这里返回两列,第一列名为c1,第二列名为c2fieldNames.add("c2");//存储返回的数据的字段类型检查器,OI是ObjectInspector的缩写ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();//第一列为Integer类型,第二列为String类型fieldOIs.add(PrimitiveObjectInspectorFactory.javaIntObjectInspector);fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);//返回结构对象检查器~return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);}/*** @param args 请注意这里我没用到args,args就是参数,如果hive中是以两个列为参数,则* 一行中的两个值就在这个args内* @throws HiveException*/@Overridepublic void process(Object[] args) throws HiveException {//请注意,如果要将args[0] 或其它值转为String,请使用toString方法,我用(String) 这种强转然后报错了!但是我在java程序中测了一下,强转String是可以的,下次再试试吧,这次是已经黔驴技穷了~Object[] first={1,"a"}; //这是一行数据Object[] second={2,"b"};//一次forward的是一行数据~一个process函数是处理一行,这里有两个forward,因此该函数//传入一行,返回了两行forward(first); //返回第一行数据forward(second); //返回第二行数据}@Overridepublic void close() throws HiveException {}
}
打成jar包(如果jar包名字太复杂,就把名字改简单点)
hive调用jar包创造函数
上传jar包有两种方法:
方法1:上传到linux下导入hive
(就用这种方法)
在hive家目录下创建文件夹auxlib。hive下的auxlib目录下的jar包可以被hive所读取,专门用于放置自定义的jar包
[root@hadoop102 hive]# mkdir auxlib
将自定义函数的jar包放入到该目录下
[root@hadoop102 auxlib]# ls
myUDTF.jar
在hive的gmall库中创建函数
创建函数的语句:create function 函数名 as ‘主类名’
很厉害,这里连jar包都不用指定,即便在auxlib下有多个jar包它也能找到~
hive (testdb)> create function myfun_udf as 'com.jc.mytest.myudf.MyUDF';
OK
hive (testdb)> create function myfun_udtf as 'com.jc.mytest.myudtf.MyUDTF';
OK
对方法进行测试
方法2:上传到hdfs上再导入hive
(了解即可,我测试了,然后失败了,没能成功~)
将 jar 包上传到HDFS上的/hive/function路径下
[root@hadoop102 mydir]# hadoop fs -put myUDTF.jar /hive/function
create function test_udtf as 'com.jc.mytest.myudtf.MyUDTF' using jar 'hdfs://hadoop102:9000/hive/function/myUDTF.jar';
测试
score表的数据
1001 01 90
1001 02 90
1001 03 90
1002 01 85
1002 02 85
1002 03 70
1003 01 70
1003 02 70
1003 03 85
UDF测试:
select myfun_udf(subject_id)
from score;
结果:
1
1
1
1
1
1
1
1
1
UDTF测试:
select myfun_udtf(subject_id)
from score;
结果:
1 a
2 b
1 a
2 b
1 a
2 b
1 a
2 b
1 a
2 b
1 a
2 b
1 a
2 b
1 a
2 b
1 a
2 b
问题:
- 我的hive的Tez引擎垮了啊。内存检查我关了但是还是Tez会话创建失败,我就重新使用MR引擎了。难道是因为内存检查失效了吗
- 创建函数的时候名字打错了,怎么删除函数?
-- 删除名为 myfun_utf 的函数
DROP FUNCTION IF EXISTS myfun_utf;
- 我创建的是临时函数还是永久函数?
创建临时函数,只需要在function前面加上temporary即可,如果没加,默认是永久函数
create temporary function [dbname.]function_name
AS class_name;
自定义UDF函数和UDTF函数相关推荐
- UDF函数和UDTF函数的图解举例,追加UDAF函数
简述UDF/UDAF/UDTF是什么,各自解决问题及应用场景 - 玩转大数据 - 博客园 自定义UDF和UDTF函数的两个作用点: 1.埋点log打印日志,方便任务出现问题后进行调试 2.有一些SQL ...
- 自定义UDF、UDAF、UDTF函数
注意事项: 1.udf.udaf函数的使用都需要使用sqlContext来创建function,如果是scala里需要引用Java的方法或者函数的话,需要包装一下,再写个scala的方法,将Java的 ...
- 自定义UDF、UDTF函数
自定义步骤 自定义UDF:继承UDF,重写evaluate方法 自定义UDTF:继承GenericUDTF,重写3个方法:initialize(自定义输出数据的列名和类型),process(将结果返回 ...
- 8.Hive基础—函数—系统内置函数、常用内置函数、自定义函数、自定义UDF函数、自定义UDTF函数
本文目录如下: 第8章 函数 8.1 系统内置函数 8.2 常用内置函数 8.2.1 空字段赋值 8.2.2 CASE WHEN THEN ELSE END 8.2.3 行转列 8.2.4 列转行 8 ...
- Hive自定义UDF和聚合函数UDAF
2019独角兽企业重金招聘Python工程师标准>>> 转自:http://computerdragon.blog.51cto.com/6235984/1288567 Hive是一种 ...
- UDF、UDAF、UDTF函数编写
一.UDF函数编写 1.步骤 1.继承UDF类 2.重写evalute方法 1.继承GenericUDF 2.实现initialize.evaluate.getDisplayString方法 2.案例 ...
- Hive _函数(系统内置函数、自定义函数、自定义UDF函数)
函数 系统内置函数 1.查看系统自带的函数 show functuions; 2.显示自带的函数的用法 desc function month; 3.详细显示自带的函数的用法 desc functio ...
- Hive 自定义UDF函数讲解
目录 一.UDF描述 二.UDF种类 三.自定义实现UDF和UDTF 3.1 需求 3.2 项目pom文件 3.3 Hive建表测试及数据 3.4UDF函数编写 3.5 UDTF函数编写 四:添加到h ...
- FlinkSQL使用自定义UDTF函数行转列-IK分词器
一.背景说明 优惠券网 www.cps3.cn 本文基于IK分词器,自定义一个UDTF(Table Functions),实现类似Hive的explode行转列的效果,以此来简明开发过程. 如下图Fl ...
最新文章
- 微信token验证失败的解决方法
- Dbgrid 中表字段所在的列序号
- 平底方向盘比圆形方向盘好在哪?
- 输入有序数组返回下标
- 获取文件夹下的文件名并存入txt中
- 定义mysql日志_请教:如何查看mysql数据定义操作的日志
- 存储过程是用来干什么的_感情不是用来考验的
- Android 内容提供器---简介
- 6寸照片的尺寸是多少_各类证件照标准尺寸大全
- java jdom追加节点_java-使用xpath和jdom选择一个节点
- python用递归法将一个整数n转化为字符串_Python学习之旅 —— 基础篇(五)字符串格式化、递归、生成器迭代器...
- 利用MATLAB进行二次曲线方程的正交变换化简
- 实验物理与工业控制系统---EPICS
- FreeMarker模板导出pdf,页码,页脚,分页等
- 一些有趣但少有人知的 Python 特性
- LC-3 中断实验 (深大计系1实验5)
- 24种设计模式的定义和使用场合
- 脸上不同位置长痘痘的原因,华仁堂贾主任祛痘为你提示
- 小区综合业务系统/小区管理系统
- thinkpad如何屏蔽bios更新 提示电池_华硕(圣骑)100系 200系 BIOS更新支持8代CPU软件刷新...
热门文章
- Chapter7 机器人导航仿真(Ⅰ)----导航实现
- 使用nginx配置一个ip对应多个域名
- AVX | 关于RC电路耦合、相移、滤波、微分、积分的那些事儿~
- 模拟cmos集成电路(9)
- 2.开关电源中常见的控制算法
- 【关于单片机的N多问题】关于单片机的N多问题
- 记录:remote: You are not allowed to push code to this project...【亲测有效】
- 35岁 学java_35岁没基础,现在去学java编程还来得及吗?应该注意哪些事项?
- 记一次摸不着头脑的FullGC问题 (Thumbnails压缩图片占用巨大内存)
- 机器学习基础(七):概率图模型(HMM、MRF、CRF、话题模型、推断方法)