hive添加自定义函数方式有两种,一种是继承UDF ,另一种继承GenericUDF
UDF开发较为方便,先新版本中已被弃用,建议使用GenericUDF org.apache.hadoop.hive.ql.exec.UDF
GenericUDF开发更加灵活,但也增加了复杂成本 org.apache.hadoop.hive.ql.udf.generic.GenericUDF
以下以,UDF开发演示自定义函数的,整体过程:
1.新建maven工程,添加如下依赖
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>3.1.2</version> </dependency>
如添加判断是否为空自定义函数,代码如下:
package com.bigdata.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; import java.util.regex.Pattern; /** * 自定义UDF函数 * 输入:Tom * 输出:hello:Tom */ @Description( name = "udf_is_null", value = "_FUNC_(str) - Returns str is null?0:1", extended = "Example:\n > SELECT _FUNC_(\'Facebook\') FROM src LIMIT 1;\n return 1 " ) public class UdfIsNull extends UDF { public int evaluate(final String s) { if (s == null || s.toString().trim().toLowerCase().equals("null") || Pattern.matches("\\s+",s.toString())||s.toString().trim().equals("")) { return 0; } return 1; } public static void main(String[] args) { System.out.println("值为"+new UdfIsNull().evaluate(new String("null" ))); } }
方式一:添加临时函数(仅当前会话有效)
a)将jar上传至服务器,进入hive,执行: add jar /root/jar/hive_function-1.0-SNAPSHOT.jar;
b)执行命令,添加临时函数:create temporary function udf_is_null as 'com.bigdata.hive.udf.UdfIsNull';
c)查看函数 desc function udf_is_null;
d)测试函数: select udf_is_null(“”);
方式二:添加永久函数(永久函数,创建后可以在任意客户端使用)
a)将jar上传至hdfs文件系统:hdfs dfs -put ./hive_function-1.0-SNAPSHOT.jar /libs
b)进入hive,创建函数
create function udf_is_null
as 'com.bigdata.hive.udf.UdfIsNull'
using jar 'hdfs:///libs/hive_function-1.0-SNAPSHOT.jar'