You need to enable JavaScript to run this app.
导航
UDF 开发
最近更新时间:2025.04.01 20:13:40首次发布时间:2024.11.12 16:54:08
我的收藏
有用
有用
无用
无用

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

UDF 分类

UDF 分类

描述

UDF(User Defined Scalar Function)

自定义标量函数,通常称为UDF。其输入与输出是一对一的关系,即读入一行数据,写出一条输出值。

UDTF(User Defined Table-valued Function)

自定义表值函数,用来解决一次函数调用输出多行数据场景的,也是唯一一个可以返回多个字段的自定义函数。

UDAF(User Defined Aggregation Function)

自定义聚合函数,其输入与输出是多对一的关系,即将多条输入记录聚合成一条输出值,可以与SQL中的Group By语句联合使用。

开发 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.3</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 开发工作。

使用 UDF

  1. 使用 SSH 方式登录到集群主节点
  2. 使用文件传输工具将生成的 JAR 包上传到当前 SSH 的节点。
  3. 将生成的 JAR 包上传至 HDFS
hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/
  1. 创建 UDF 函数
    • 执行以下命令,进入 Hive 命令行
su hive
hive
CREATE FUNCTION myfunc AS "org.example.MyUDF" USING JAR "hdfs:///user/hive/hiveudf-1.0-SNAPSHOT.jar";

参数

说明

myfunc

UDF 函数的名称

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)