Hive 自定义函数UDF开发手把手教程—— 创建临时函数和永久函数
Hive 自定义函数UDF开发手把手教程—— 创建临时函数和永久函数
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方法,就可以了!
1.自定义udf
1.1 使用IDEA创建maven项目,创建HelloUDF类 ,编写代码,修改pom文件,测试运行是否成功【代码demo下载】
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
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">
<modelVersion>4.0.0</modelVersion>
<groupId>utils.360jinrong.yyz</groupId>
<artifactId>HelloUDF</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- import org.apache.hadoop.hive.ql.exec.UDF; 引入需要继承的UDF类,这部分需要在pom文件新增hive相关的包-->
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
</project>
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"));
}
}
2.将自定义的udf函数打包成jar包
打包方法如上图所示,完成之后,会在项目的target目录下找到打包生成的jar包
3.创建临时udf函数
3.1.创建临时函数语法:
CREATE TEMPORARY FUNCTION function_name AS class_name;
function_name 函数名
class_name 类路径,包名+类名
3.2.将jar加入到hive中
创建临时函数时添加的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]
3.3.创建sayhello临时函数
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)
3.4.测试使用函数
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)
3.5.删除临时函数示例
语法: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'
4.创建永久函数
4.1.创建永久函数的语法:
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
file_uri:是hdfs上的jar包目录
4.2. 添加jar包的方法
-- hdfs的根目录下创建self_udf文件夹,并将jar包上传到hdfs上的/self_udf文件夹下
[[email protected] ~/simth/test_new]$ hadoop fs -put HelloUDF-1.0-SNAPSHOT.jar /home/simth/softwares/self_udf/
-- 查看jar
[[email protected] ~/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
4.3.创建永久函数及查看示例
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.****.net/gongpulin/article/details/79406747