博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HIVE自定义函数--UDF函数(用户自定义函数)详解
阅读量:2173 次
发布时间:2019-05-01

本文共 2760 字,大约阅读时间需要 9 分钟。

虽然HIVE当中的函数功能很强大,但是有的时候我们需要自定义函数,今天我们介绍一个最简单的函数,UDF函数. 当

Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function).

UDF:给参数计算出一个结果.

参考博客:https://www.cnblogs.com/jifengblog/p/9278972.html

直接进入正题,主要步骤:

回到顶部

UDF函数创建步骤
(1)新建Java Maven项目,添加依赖

1

2
3
4
5
6

org.apache.hive hive-exec 0.13.1  

(2)继承UDF(org.apache.hadoop.hive.ql.exec.UDF)类,重写evaluate方法

1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.zmy.hive.udf;

import org.apache.hadoop.hive.ql.exec.Description;

import org.apache.hadoop.hive.ql.exec.UDF;

/**

  • 自定义加法UDF.
    */
    @Description(name = “add”,
    value = “add(1,2)”,
    extended = “this is a extended info for add func!!”)
    public class AddUdf extends UDF
    {
    public int evaluate(int a, int b)
    {
    return a + b;
    }
    }

注意:一定要用public修饰evaluate方法以及继承UDF的类,才能被hive调用,否则会报错(如下):

1

2
hive> select addtest(10,20);
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ‘20’: Unable to instantiate UDF implementation class ThreadProcess.AddTest: java.lang.IllegalAccessException: Class org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge can not access a member of class ThreadProcess.AddTest with modifiers “”

(3)导出jar包

参考:https://www.cnblogs.com/zhangmingyang/protected/p/11450852.html

(4)部署jar包到hive所在的linux服务器

1

2
3
4
5
[mart_fro@BJLFRZ-Client-51-67 software]$ pwd
/home/mart_fro/software
[mart_fro@BJLFRZ-Client-51-67 software]$ ll
total 8
-rw-r–r-- 1 mart_fro mart_fro 4668 Sep 17 09:44 udftest-1.0-SNAPSHOT.jar

(5)在hive的命令行下添加jar包(注意:不需要加双引号),目的是添加jar包到hive的类classpath路径

1

2
3
hive> add jar /home/mart_fro/software/udftest-1.0-SNAPSHOT.jar;
Added [/home/mart_fro/software/udftest-1.0-SNAPSHOT.jar] to class path
Added resources: [/home/mart_fro/software/udftest-1.0-SNAPSHOT.jar]
如果没有这个步骤,后续会报错:

1

2
3
hive> create temporary function addtest as ‘ThreadProcess.AddTest’;
FAILED: Class ThreadProcess.AddTest not found
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask
需要注意的是:无论是临时函数还是永久函数,每次进入hive的时候都需要重新添加jar包,除非你将jar包位于hive/lib下.

  • View Code

(6)注册函数和jar包进行关联,注册到当前的数据库当中(如果没有指定数据库,是默认的default库)

a. 临时函数,不会在mysql当中生成记录,每次都要重新注册.

1

2
3
4
5
6
create temporary function add as ‘com.zmy.hive.udf.AddUdf’;
hive> desc function extended add;
OK
add(1,2)
this is a extended info for add func!!
Time taken: 0.018 seconds, Fetched: 2 row(s)

b. 永久函数,会在mysql当中生成注册记录,不需要每次重新注册.

备注:这种方式非常重要,完全分布式时需要使用该方式,否则找不到函数类.

1

2
3
4
5
6
7
create function add as ‘com.zmy.hive.udf.AddUdf’;
hive> desc function extended add;
OK
add(1,2)
Synonyms: default.add
this is a extended info for add func!!
Time taken: 0.031 seconds, Fetched: 3 row(s)

(7)调用自定义的UDF函数

1

2
3
hive> select add(1,2);
3
Time taken: 0.913 seconds, Fetched: 1 row(s)

(8)注意查看mysql的注册信息 (略)

1

2
select * from bigg_hive.funcs ;
select * from bigg_hive.func_ru ;

你可能感兴趣的文章
初探Java设计模式4:一文带你掌握JDK中的设计模式
查看>>
初探Java设计模式5:一文了解Spring涉及到的9种设计模式
查看>>
Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理
查看>>
Java集合详解2:一文读懂Queue和LinkedList
查看>>
Java集合详解3:一文读懂Iterator,fail-fast机制与比较器
查看>>
Java集合详解4:一文读懂HashMap和HashTable的区别以及常见面试题
查看>>
Java集合详解5:深入理解LinkedHashMap和LRU缓存
查看>>
Java集合详解6:这次,从头到尾带你解读Java中的红黑树
查看>>
Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同
查看>>
Java集合详解8:Java集合类细节精讲,细节决定成败
查看>>
Java并发指南1:并发基础与Java多线程
查看>>
Java并发指南2:深入理解Java内存模型JMM
查看>>
Java并发指南3:并发三大问题与volatile关键字,CAS操作
查看>>
Java并发指南4:Java中的锁 Lock和synchronized
查看>>
Java并发指南5:JMM中的final关键字解析
查看>>
Java并发指南6:Java内存模型JMM总结
查看>>
Java并发指南7:JUC的核心类AQS详解
查看>>
Java并发指南8:AQS中的公平锁与非公平锁,Condtion
查看>>
Java网络编程和NIO详解6:Linux epoll实现原理详解
查看>>
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
查看>>