文章目录

  • 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函数

  1. extends UDF
  2. 编写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函数

  1. extends genericUDTF

  2. 编写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家目录下创建文件夹auxlibhive下的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

问题:

  1. 我的hive的Tez引擎垮了啊。内存检查我关了但是还是Tez会话创建失败,我就重新使用MR引擎了。难道是因为内存检查失效了吗
  2. 创建函数的时候名字打错了,怎么删除函数?
-- 删除名为 myfun_utf 的函数
DROP FUNCTION IF EXISTS myfun_utf;
  1. 我创建的是临时函数还是永久函数?
    创建临时函数,只需要在function前面加上temporary即可,如果没加,默认是永久函数
create temporary function [dbname.]function_name
AS class_name;

自定义UDF函数和UDTF函数相关推荐

  1. UDF函数和UDTF函数的图解举例,追加UDAF函数

    简述UDF/UDAF/UDTF是什么,各自解决问题及应用场景 - 玩转大数据 - 博客园 自定义UDF和UDTF函数的两个作用点: 1.埋点log打印日志,方便任务出现问题后进行调试 2.有一些SQL ...

  2. 自定义UDF、UDAF、UDTF函数

    注意事项: 1.udf.udaf函数的使用都需要使用sqlContext来创建function,如果是scala里需要引用Java的方法或者函数的话,需要包装一下,再写个scala的方法,将Java的 ...

  3. 自定义UDF、UDTF函数

    自定义步骤 自定义UDF:继承UDF,重写evaluate方法 自定义UDTF:继承GenericUDTF,重写3个方法:initialize(自定义输出数据的列名和类型),process(将结果返回 ...

  4. 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 ...

  5. Hive自定义UDF和聚合函数UDAF

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://computerdragon.blog.51cto.com/6235984/1288567 Hive是一种 ...

  6. UDF、UDAF、UDTF函数编写

    一.UDF函数编写 1.步骤 1.继承UDF类 2.重写evalute方法 1.继承GenericUDF 2.实现initialize.evaluate.getDisplayString方法 2.案例 ...

  7. Hive _函数(系统内置函数、自定义函数、自定义UDF函数)

    函数 系统内置函数 1.查看系统自带的函数 show functuions; 2.显示自带的函数的用法 desc function month; 3.详细显示自带的函数的用法 desc functio ...

  8. Hive 自定义UDF函数讲解

    目录 一.UDF描述 二.UDF种类 三.自定义实现UDF和UDTF 3.1 需求 3.2 项目pom文件 3.3 Hive建表测试及数据 3.4UDF函数编写 3.5 UDTF函数编写 四:添加到h ...

  9. FlinkSQL使用自定义UDTF函数行转列-IK分词器

    一.背景说明 优惠券网 www.cps3.cn 本文基于IK分词器,自定义一个UDTF(Table Functions),实现类似Hive的explode行转列的效果,以此来简明开发过程. 如下图Fl ...

最新文章

  1. 微信token验证失败的解决方法
  2. Dbgrid 中表字段所在的列序号
  3. 平底方向盘比圆形方向盘好在哪?
  4. 输入有序数组返回下标
  5. 获取文件夹下的文件名并存入txt中
  6. 定义mysql日志_请教:如何查看mysql数据定义操作的日志
  7. 存储过程是用来干什么的_感情不是用来考验的
  8. Android 内容提供器---简介
  9. 6寸照片的尺寸是多少_各类证件照标准尺寸大全
  10. java jdom追加节点_java-使用xpath和jdom选择一个节点
  11. python用递归法将一个整数n转化为字符串_Python学习之旅 —— 基础篇(五)字符串格式化、递归、生成器迭代器...
  12. 利用MATLAB进行二次曲线方程的正交变换化简
  13. 实验物理与工业控制系统---EPICS
  14. FreeMarker模板导出pdf,页码,页脚,分页等
  15. 一些有趣但少有人知的 Python 特性
  16. LC-3 中断实验 (深大计系1实验5)
  17. 24种设计模式的定义和使用场合
  18. 脸上不同位置长痘痘的原因,华仁堂贾主任祛痘为你提示
  19. 小区综合业务系统/小区管理系统
  20. thinkpad如何屏蔽bios更新 提示电池_华硕(圣骑)100系 200系 BIOS更新支持8代CPU软件刷新...

热门文章

  1. Chapter7 机器人导航仿真(Ⅰ)----导航实现
  2. 使用nginx配置一个ip对应多个域名
  3. AVX | 关于RC电路耦合、相移、滤波、微分、积分的那些事儿~
  4. 模拟cmos集成电路(9)
  5. 2.开关电源中常见的控制算法
  6. 【关于单片机的N多问题】关于单片机的N多问题
  7. 记录:remote: You are not allowed to push code to this project...【亲测有效】
  8. 35岁 学java_35岁没基础,现在去学java编程还来得及吗?应该注意哪些事项?
  9. 记一次摸不着头脑的FullGC问题 (Thumbnails压缩图片占用巨大内存)
  10. 机器学习基础(七):概率图模型(HMM、MRF、CRF、话题模型、推断方法)