You need to enable JavaScript to run this app.
导航
自定义函数 (UDF)
最近更新时间:2022.09.22 16:55:46首次发布时间:2022.09.22 16:55:46

您可以通过创建自定义函数(UDF)来满足不同的计算需求。UDF 在使用上与普通的内建函数类似。本文为您介绍自定义函数的开发和使用流程。

1 UDF 分类

UDF 分类描述
UDF(User Defined Scalar Function)自定义标量函数,通常称为UDF。其输入与输出是一对一的关系,即读入一行数据,写出一条输出值。
UDTF(User Defined Table-valued Function)自定义表值函数,用来解决一次函数调用输出多行数据场景的,也是唯一一个可以返回多个字段的自定义函数。
UDAF(User Defined Aggregation Function)自定义聚合函数,其输入与输出是多对一的关系,即将多条输入记录聚合成一条输出值,可以与SQL中的Group By语句联合使用。

2 前提条件

3 开发 UDF

  1. 使用本地开发者工具,创建 Maven 工程
mvn archetype:generate -DgroupId=com.example -DartifactId=hiveudf -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  1. 添加 pom 依赖
<dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>3.1.2</version>
      <exclusions>
         <exclusion>
           <groupId>org.pentaho</groupId>
           <artifactId>*</artifactId>
         </exclusion>
      </exclusions>
</dependency>
  1. 创建一个类,继承 Hive UDF 类。

提示:类名可以自由定义,本文以 MyUDF 为例。

package org.example;

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

/**
 * Hello world!
 *
 */
public class MyUDF extends UDF
{
    public String evaluate(final String s) {
        if (s == null) { return null; }
        return s + ":HelloWorld";
    }
}
  1. 将自定义代码打成 JAR 包
mvn clean package -DskipTests

target 目录下会出现 hiveudf-1.0-SNAPSHOT.jar 的JAR包,即代表完成了 UDF 开发工作。

4 使用 UDF

  1. 使用 SSH 方式登录到集群主节点,详情请参见使用 SSH连接主节点

  2. 使用文件传输工具将生成的 JAR 包上传到当前 SSH 的节点。

  3. 将生成的 JAR 包上传至 HDFS

hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/
  1. 创建 UDF 函数

    • 执行以下命令,进入 Hive 命令行
    su hive
    hive
    
    • 进入 hive 后,执行以下命令,应用生成的 JAR 创建函数
    CREATE FUNCTION myfunc AS "org.example.MyUDF" USING JAR "hdfs:///user/hive/hiveudf-1.0-SNAPSHOT.jar";
    
参数说明
myfuncUDF 函数的名称
org.example.MyUDF是开发 UDF 中创建的
hdfs:///user/hive/hiveudf-1.0-SNAPSHOT.jar上传 JAR 包到 HDFS 的路径

当出现以下信息时,表示创建成功

Added [/tmp/8df0a4d5-5251-4a2f-99c5-413e88189041_resources/hiveudf-1.0-SNAPSHOT.jar] to class path Added resources: [hdfs:///user/hive/hiveudf-1.0-SNAPSHOT.jar] OK Time taken: 0.612 seconds


  1. 执行以下命令,使用 UDF 函数
SELECT myfunc("Hive");

返回如下信息:

OK
Hive:HelloWorld
Time taken: 1.781 seconds, Fetched: 1 row(s)