Hive中,除了提供丰富的内置函数(见[一起学Hive]之二–Hive函数大全-完整版)之外,还允许用户使用Java开发自定义的UDF函数。开发自定义UDF函数有两种方式,一个是继承org.apache.hadoop.hive.ql.exec.UDF,另一个是继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
如果是针对简单的数据类型(比如String、Integer等)可以使用UDF,如果是针对复杂的数据类型(比如Array、Map、 Struct等),可以使用GenericUDF,另外,GenericUDF还可以在函数开始之前和结束之后做一些初始化和关闭的处理操作。
关于hive的udf介绍,就不多啰嗦了。下面将教会你怎样开发一个udf函数,已经如何部署到服务器上的hive环境中运行。用最简单的话来说,就是教大家怎么让自己开发的udf跑起来。。。
大家记住下面一句话就可以:继承UDF类,重写evaluate方法,就可以了!
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
utils.360jinrong.yyz
HelloUDF
1.0-SNAPSHOT
org.apache.hive
hive-exec
0.13.0
org.apache.hadoop
hadoop-common
2.5.0
package com.ruozedata.bigdata;
//引入需要继承的UDF类,这部分需要在pom文件新增hive相关的包
import org.apache.hadoop.hive.ql.exec.UDF;
public class HelloUDF extends UDF{
//重写evaluate方法
public String evaluate(String input){
return "Hello:" + input;
}
//重写evaluate方法
public String evaluate(String input,String input2){
return "Hello:" + input + ":" + input2;
}
public static void main(String[] args){
HelloUDF udf = new HelloUDF();
System.out.println(udf.evaluate("Simth"));
System.out.println(udf.evaluate("Simth", "YAO"));
}
}
打包方法如上图所示,完成之后,会在项目的target目录下找到打包生成的jar包
CREATE TEMPORARY FUNCTION function_name AS class_name;
function_name 函数名
class_name 类路径,包名+类名
创建临时函数时添加的jar包应该时本地路径,而非hdfs路径
hive> add jar /home/simth/softwares/self_udf/HelloUDF-1.0-SNAPSHOT.jar;
/home/simth/softwares/self_udf/HelloUDF-1.0-SNAPSHOT.jar does not exist
Query returned non-zero code: 1, cause: /home/simth/softwares/self_udf/HelloUDF-1.0-SNAPSHOT.jar does not exist
hive> add jar /home/simth/test_new/HelloUDF-1.0-SNAPSHOT.jar;
Added [/home/simth/test_new/HelloUDF-1.0-SNAPSHOT.jar] to class path
Added resources: [/home/simth/test_new/HelloUDF-1.0-SNAPSHOT.jar]
hive> create temporary function sayhello as 'com.ruozedata.bigdata.HelloUDF';
OK
Time taken: 0.011 seconds
hive> show functions;
sayhello
second
……
……
year
|
~
Time taken: 0.009 seconds, Fetched: 220 row(s)
hive> select sayhello('zhang','san');
OK
Hello:zhang:san
Time taken: 6.337 seconds, Fetched: 1 row(s)
hive> select sayhello('zhang');
OK
Hello:zhang
Time taken: 7.944 seconds, Fetched: 1 row(s)
语法:DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
hive> DROP TEMPORARY FUNCTION IF EXISTS sayhello;
OK
Time taken: 0.004 seconds
hive> select sayhello('zhang');
FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'sayhello'
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
file_uri:是hdfs上的jar包目录
-- hdfs的根目录下创建self_udf文件夹,并将jar包上传到hdfs上的/self_udf文件夹下
[hdp@app11 ~/simth/test_new]$ hadoop fs -put HelloUDF-1.0-SNAPSHOT.jar /home/simth/softwares/self_udf/
-- 查看jar
[hdp@app11 ~/simth/test_new]$ hadoop dfs -ls /home/simth/softwares/self_udf
Found 1 items
-rw-r--r-- 3 hdp hdp 2669 2019-10-11 10:50 /home/simth/softwares/self_udf/HelloUDF-1.0-SNAPSHOT.jar
hive> CREATE FUNCTION sayhello AS 'com.ruozedata.bigdata.HelloUDF' USING JAR '/home/simth/softwares/self_udf/HelloUDF-1.0-SNAPSHOT.jar';
之后在不同窗口都可使用该自定义函数:
-- 查看函数列表
hive> show functions;
OK
abs
acos
……
add_months
ruozedata.sayhello
hive>
注意:
1). ruozedata.sayhello函数创建成功。永久函数是已:库名.函数名的存在,同库使用的时候可以直接用函数名,不同库使用的时候需要带上库名
2). 临时函数和永久函数的区别: 临时函数仅对当前session(黑窗口)有效。 永久函数是全局的。
参考:http://blog.itpub.net/29609890/viewspace-2157096/
https://blog.csdn.net/gongpulin/article/details/79406747