UDF几个相关概念:
UDF: one-to-one row mapping : upper substr【进来一行出去一行】
UDAF: Aggregation Many-to-one row mapping 比如sum/min【进来多行出去一行】
UDTF: Table-generating one-to-many 比如:lateral view explode()【一对多】
编写UDF函数测试代码:
1. 添加依赖
pod.xml添加hive相关的依赖:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.3.4</version>
</dependency>
2. ZeroifNull类
udf的功能:如果字段为null时,将值改为null,不为null则输出原值
创建一个ZeroifNull类继承UDF,并且重写evaluate方法
public class ZeroifNull extends UDF {
public String evaluate(String input) {
//TODO...此处为开发业务逻辑的地方
return Optional.ofNullable(input).orElse("0");
}
public static void main(String[] args) {
ZeroifNull zeroifNull = new ZeroifNull();
String evaluate = zeroifNull.evaluate(null);
System.out.println(evaluate);
}
}
3. 打jar包
在idea中用maven打包后,上传到hive服务器;包名为:zeroifnull-1.0-SNAPSHOT.jar
创建函数
可以创建临时函数或者永久函数:
create temporary function zero_if_null as 'com.ht706.hive.udf.ZeroifNUll';
create function zero_if_null as 'com.ht706.hive.udf.ZeroifNull';
方法一:创建临时函数(Temporary Functions)
添加jar包:
add jar /opt/zeroifnull-1.0-SNAPSHOT.jar;
创建函数:
create temporary function zero_if_null as 'com.ht706.hive.udf.ZeroifNull';
方法二:无需手动add jar包
在hive的家目录下创建auxlib目录,把jar包放在此目录下即可;
不管创建临时函数,还是持久函数,把jar放入auxlib后就无需手动进行加载;
方法三:创建持久函数(Permanent Functions)
创建函数:
CREATE FUNCTION zero_if_null AS 'com.ht706.hive.udf.ZeroifNull';
方法四:创建持久函数(Permanent Functions),并且使用hdfs上的jar;生产建议此种方式
将jar包放在hdfs上;
hdfs dfs -put /opt/zeroifnull-1.0-SNAPSHOT.jar /hive/lib
创建函数:
CREATE FUNCTION zero_if_null AS 'com.ht706.hive.udf.ZeroifNull' USING JAR 'hdfs://hadoop:9000/hive/lib/zeroifnull-1.0-SNAPSHOT.jar';
总结:可以编写一些如zero_if_null, 或者将字符串的开始下标到结束下标 变成xxx(mask)或者一些字段类型转换的函数。