7、hive的UDF使用

UDF: one-to-one row mapping : upper substr【进来一行出去一行】
UDAF: Aggregation   Many-to-one row mapping   比如sum/min【进来多行出去一行】
UDTF: Table-generating  one-to-many    比如:lateral view explode()【一对多】

编写测试UDF函数

pom文件添加

<hive.version>1.1.0-cdh5.7.0</hive.version>

  <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>${hive.version}</version>
    </dependency>

UDF函数开发

package com.kun.hive;

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

public class HelloUDF extends UDF{

    public String evaluate(String input){
        //TODO:工作中的详细业务功能
        return "Hello:"+input;
    }

    public String evaluate(String input1,String input2){
        //TODO:工作中的详细业务功能
        return "Hello:"+input1+"=>"+input2;
    }


}

打包上传到服务器
 

[hadoop@hadoop hive]$ pwd
/home/hadoop/data/hive
[hadoop@hadoop hive]$ ll
总用量 8
-rw-r--r--. 1 hadoop hadoop 7483 4月  18 10:39 hive_UDF.jar

Hive中创建函数

创建临时函数

临时函数仅对当前session(黑窗口)有效

添加jar包到hive
hive> add jar /home/hadoop/data/hive/hive_UDF.jar;

创建临时函数
语法:

CREATE TEMPORARY FUNCTION function_name AS class_name;   
                    function_name函数名    
                    class_name 类路径,包名+类名 

实例: 
  创建sayhello函数 

hive> create temporary function sayhello as 'com.kun.hive.HelloUDF';
OK
Time taken: 0.485 seconds
hive>
hive> show functions; 【查看可以看到sayhello】
OK 
rpad
rtrim
sayhello
second
sentences

测试:

hive> select sayhello('wuwang');
OK
Hello:wuwang
Time taken: 2.712 seconds, Fetched: 1 row(s)
hive> select sayhello('wuwang','nihao');
OK
Hello:wuwang=>nihao
Time taken: 0.128 seconds, Fetched: 1 row(s)
hive> 

删除临时函数 :

语法:

DROP TEMPORARY FUNCTION [IF EXISTS] function_name; 

 实例测试: 

hive> DROP TEMPORARY FUNCTION IF EXISTS sayhello;
OK
Time taken: 0.003 seconds
hive> select sayhello('wuwang');
FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'sayhello'
hive> 

创建永久函数

上传语法:

CREATE FUNCTION [db_name.]function_name AS class_name 
            [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ]; 
            file_uri:是hdfs上的jar包目录 

上传实例:

[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ hadoop fs -mkdir /lib
[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ hadoop fs -put /home/hadoop/data/hive/hive_UDF.jar /lib/
[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ hadoop fs -ls /lib/
Found 1 items
-rw-r--r--   1 hadoop supergroup       7483 2019-04-18 11:10 /lib/hive_UDF.jar
[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ 

创建语法:

CREATE TEMPORARY FUNCTION function_name AS class_name USING JAR path;   
                    function_name函数名    
                    class_name 类路径,包名+类名 
                    path jar包hdfs路径

创建实例:

hive> CREATE FUNCTION sayhello2 AS 'com.kun.hive.HelloUDF' USING JAR 'hdfs://hadoop:8020/lib/hive_UDF.jar'
    > ;
converting to local hdfs://hadoop:8020/lib/hive_UDF.jar
Added [/tmp/4b56b71a-d406-4ee7-89db-9d3c97a19e81_resources/hive_UDF.jar] to class path
Added resources: [hdfs://hadoop:8020/lib/hive_UDF.jar]
OK
Time taken: 0.552 seconds
hive> show functions;【查看】
OK
dayofmonth
decode
default.sayhello2

测试:

hive> select sayhello2('wuwang');
OK
Hello:wuwang
Time taken: 1.228 seconds, Fetched: 1 row(s)

另外开一个session测试:

eb7771227bcd072123d6f57eed6b69d6852.jpg

可以查看到元数据:

9b9e14b6bb792f68ba3e4f27f30576b0a13.jpg

重新启动hadoop和hive发现sayhello2依旧可用

hive> select sayhello2('wu');
converting to local hdfs://hadoop:8020/lib/hive_UDF.jar
Added [/tmp/9dcbba84-d9db-4bcf-8eed-2cf20abfc510_resources/hive_UDF.jar] to class path
Added resources: [hdfs://hadoop:8020/lib/hive_UDF.jar]
OK
Hello:wu
Time taken: 2.477 seconds, Fetched: 1 row(s)
hive> 

Hive直接使用不用创建函数

前置java版本为1.8

1、下载源码 
   hive-1.1.0-cdh5.7.0-src.tar.gz 
   http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0-src.tar.gz 

2、解压源码
   tar -zxvf hive-1.1.0-cdh5.7.0-src.tar.gz -C 

3、将HelloUDF.java文件增加到HIVE源码中

[root@hadoop01 hive-1.1.0-cdh5.7.0]# cp HelloUDF.java 到 ql/src/java/org/apache/hadoop/hive/ql/udf/
更改HelloUDF.java的第一行包路径为package org.apache.hadoop.hive.ql.udf;

4、修改FunctionRegistry.java 文件
 [root@hadoop01 hive-1.1.0-cdh5.7.0]#  cd ql/src/java/org/apache/hadoop/hive/ql/exec/
   vi FunctionRegistry.java
   在import中增加:import org.apache.hadoop.hive.ql.udf.HelloUDF;
   在代码体头部 static 块中添加:system.registerUDF("helloUDF", HelloUDF.class, false);

5、重新编译
 [root@hadoop01 hive-1.1.0-cdh5.7.0]#  mvn clean package -DskipTests -Phadoop-2 -Pdist

15178019bee57eecb174558c277e3e26310.jpg

6、两种配置方法

  1. 把编译后的jar包作为配置包
  2. 将编译后带UDF函数的包复制到旧hive环境

      到
      [root@hadoop01 target]# pwd /root/hive-1.1.0-cdh5.7.0/packaging/target/apache-hive-1.1.0-cdh5.7.0-bin/apache-hive-1.1.0-cdh5.7.0-bin/lib
      下,找到hive-exec-1.1.0-cdh5.7.0.jar包,将此jar包拷贝到旧hive环境/lib目录下
      命令:
  最后启动hive

8、测试:
   hive
   hive (default)> show functions ;   -- 能查看到有 helloudf
   hive> select helloudf("wuwang","nihao");
   OK
   Hello:wuwang=>nihao
   Time taken: 2.086 seconds, Fetched: 1 row(s)
   hive> 

转载于:https://my.oschina.net/u/4005872/blog/3038637

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值