您可以通过创建自定义函数(UDF)来满足不同的计算需求。UDF 在使用上与普通的内建函数类似。本文为您介绍自定义函数的开发和使用流程。
UDF 分类 | 描述 |
---|---|
UDF(User Defined Scalar Function) | 自定义标量函数,通常称为UDF。其输入与输出是一对一的关系,即读入一行数据,写出一条输出值。 |
UDTF(User Defined Table-valued Function) | 自定义表值函数,用来解决一次函数调用输出多行数据场景的,也是唯一一个可以返回多个字段的自定义函数。 |
UDAF(User Defined Aggregation Function) | 自定义聚合函数,其输入与输出是多对一的关系,即将多条输入记录聚合成一条输出值,可以与SQL中的Group By语句联合使用。 |
mvn archetype:generate -DgroupId=com.example -DartifactId=hiveudf -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
<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>
提示:类名可以自由定义,本文以 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"; } }
mvn clean package -DskipTests
target 目录下会出现 hiveudf-1.0-SNAPSHOT.jar 的JAR包,即代表完成了 UDF 开发工作。
使用 SSH 方式登录到集群主节点,详情请参见使用 SSH连接主节点。
使用文件传输工具将生成的 JAR 包上传到当前 SSH 的节点。
将生成的 JAR 包上传至 HDFS
hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/
创建 UDF 函数
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
SELECT myfunc("Hive");
返回如下信息:
OK
Hive:HelloWorld
Time taken: 1.781 seconds, Fetched: 1 row(s)