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下载​​​​​​​】

Hive 自定义函数UDF开发手把手教程—— 创建临时函数和永久函数_第1张图片

 

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

 

Hive 自定义函数UDF开发手把手教程—— 创建临时函数和永久函数_第2张图片

 

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包

Hive 自定义函数UDF开发手把手教程—— 创建临时函数和永久函数_第3张图片

打包方法如上图所示,完成之后,会在项目的target目录下找到打包生成的jar包

Hive 自定义函数UDF开发手把手教程—— 创建临时函数和永久函数_第4张图片

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文件夹下 

[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

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.csdn.net/gongpulin/article/details/79406747

 

你可能感兴趣的:(hive)