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

### 如何在 Hive UDF使用 `HttpURLConnection` 为了实现在 Hive 用户定义函数 (UDF) 中调用外部 HTTP API 的功能,可以利用 Java 提供的 `HttpURLConnection` 类来发送请求并处理响应。下面展示了一个简单的例子,在这个例子中创建了一个自定义 UDF 来执行 GET 请求。 #### 创建 Maven 项目结构 首先确保项目的 pom.xml 文件中有合适的依赖项用于构建 jar 包: ```xml <dependencies> <!-- Apache Hive dependencies --> </dependencies> ``` 注意这里省略了具体的版本号和其他配置细节[^1]。 #### 编写 UDF 类 接着编写实际的 UDF 实现类如下所示: ```java package com.example.hive.udf; import org.apache.hadoop.hive.ql.exec.UDF; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpGetUDF extends UDF { public String evaluate(String urlString) throws Exception { URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置请求方法为GET conn.setRequestMethod("GET"); int responseCode = conn.getResponseCode(); StringBuilder content; try(BufferedReader in = new BufferedReader( new InputStreamReader(conn.getInputStream()))) { String inputLine; content = new StringBuilder(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } } finally { conn.disconnect(); } return Integer.toString(responseCode) + "\n" + content.toString(); } } ``` 此代码片段展示了如何通过传入的目标URL字符串参数发起HTTP GET请求,并返回状态码以及服务器响应的内容作为单一字符串输出。 #### 注册与测试 UDF 函数 完成上述步骤之后,编译打包成 JAR 文件并将该文件加载到 Hive 环境下注册新函数以便后续查询语句可以直接调用它来进行网络访问操作。 ```sql ADD JAR /path/to/your/hive_udfs.jar; -- 添加jar包路径 CREATE TEMPORARY FUNCTION http_get AS 'com.example.hive.udfHttpGetUDF'; SELECT http_get('http://example.com/api/data') FROM some_table LIMIT 10; ``` 以上命令序列说明了怎样向会话临时添加外部库支持,并声明一个新的名为 `http_get` 的hive内置函数替代品指向我们刚刚实现过的Java类实例化对象;最后给出了一条示范性的SQL SELECT指令用来验证一切工作正常与否。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值