概念
在Hive中,用户可以自定义一些函数,用于扩展HiveQL的功能,而这类函数叫做UDF(用户自定义函数)。UDF分为两大类:UDAF(用户自定义聚合函数)和UDTF(用户自定义表生成函数)。
UDF函数其实就是一个简单的函数,执行过程就是在Hive转换成MapReduce程序后,执行java方法,类似于像MapReduce执行过程中加入一个插件,方便扩展。UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF。
Hive函数分类
从输入输出角度分类:
- 标准函数:一行数据中的一列或多列为输入,结果为单一值
- 聚合函数:多行的零列到多列为输入,结果为单一值
- 表生成函数:零个或多个输入,结果为多列或多行
从实现方式分类: - 内置函数
- 自定义函数
- UDF:自定义标准函数
- UDAF:自定义聚合函数
- UDTF:自定义表生成函数
Hive UDF开发流程
1.继承UDF类或GenericUDF类
2.重写evaluate()方法并实现函数逻辑
3.编译打包为jar文件
4.复制到正确的HDFS路径
5.使用jar创建临时/永久函数
6.调用函数
自定义UDF
创建maven 项目,模板选用 maven-archetype-quickstart
导入jar包
<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.1.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.6.0</version></dependency>
详细代码
package mydemo;import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;public class MyFunc extends UDF {public Text evaluate(Text txt){return new Text("Hello,"+txt.toString());
}}
打包
注册UDF
将打好的jar包移动到虚拟机中,接着上传到hdfs中
hive>add jar hdfs://192.168.56.100:9000/func/myfun-1.0-SNAPSHOT.jar;
hive>create function mytest as "mydemo.MyFunc";
注意事项:
一个用户自定义UDF必须org.apache.hadoop.hive.ql.exec.UDF;
一个UDF必须要包含有evaluate()方法,但是UDF中并没有这个方法。evaluate的参数个数以及类型都是用户自定义的。在使用的时候,Hive会调用UDF的evaluate()方法。