自定义函数(UDF)
更新时间:2025-01-23
Hive 具备诸多内建函数,能够满足您的计算需求。此外,您还可创建自定义函数(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
- 使用IDE,创建Maven工程。
工程基本信息如下,您可以自定义groupId和artifactId。
Plain Text
1<groupId>org.example</groupId>
2<artifactId>hiveudf</artifactId>
3<version>1.0-SNAPSHOT</version>
- 添加pom依赖。
Plain Text
1<dependency>
2 <groupId>org.apache.hive</groupId>
3 <artifactId>hive-exec</artifactId>
4 <version>2.3.7</version>
5 <exclusions>
6 <exclusion>
7 <groupId>org.pentaho</groupId>
8 <artifactId>*</artifactId>
9 </exclusion>
10 </exclusions>
11</dependency>
- 构建一个类,使其继承自Hive UDF类。
类名可以自定义,本文示例中类名为MyUDF。
Plain Text
1package org.example;
2
3import org.apache.hadoop.hive.ql.exec.UDF;
4
5/**
6 * Hello world!
7 *
8 */
9public class MyUDF extends UDF
10{
11 public String evaluate(final String s) {
12 if (s == null) { return null; }
13 return s + ":HelloWorld";
14 }
15}
- 将自定义的代码打成JAR包。
在pom.xml所在目录,执行如下命令制作JAR包。
Plain Text
1mvn clean package -DskipTests
target目录下会出现hiveudf-1.0-SNAPSHOT.jar的JAR包,即代表完成了UDF开发工作。
使用UDF
- 将生成的JAR包上传到集群root目录。
- 上传JAR包至HDFS。
a.通过SSH方式登录集群,详情请参见登录集群。
b.执行以下命令,将JAR包上传到HDFS。
Plain Text
1hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/warehouse/
可以通过hadoop fs -ls /user/hive/warehouse/
命令,查看是否上传成功。待返回信息如下所示表示上传成功。
Plain Text
1Found 1 items
2-rw-r--r-- 1 xx xx 2668 2021-06-09 14:13 /user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
- 创建UDF函数。
a.运行以下命令,进入到Hive命令行。
Plain Text
1hive
b.运行以下命令,利用生成的 JAR 包创建函数。
Plain Text
1create function myfunc as "org.example.MyUDF" using jar "hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar";
代码中的myfunc
是UDF函数的名称,org.example.MyUDF
是开发UDF中创建的类,hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
为上传JAR包到HDFS的路径。
当出现以下信息时,表示创建成功。
Plain Text
1Added [/private/var/folders/2s/wzzsgpn13rn8rl_0fc4xxkc00000gp/T/40608d4a-a0e1-4bf5-92e8-b875fa6a1e53_resources/hiveudf-1.0-SNAPSHOT.jar] to class path
2Added resources: [hdfs:///user/hive/warehouse/myfunc/hiveudf-1.0-SNAPSHOT.jar]
- 执行以下命令,使用UDF函数。
该函数与内置函数使用方式一样,直接使用函数名称即可访问。
Plain Text
1select myfunc("abc");
返回如下信息。
Plain Text
1OK
2abc:HelloWorld