[toc]
1. 介绍
Hive自定义函数包括三种UDF、UDAF、UDTF
- UDF(User-Defined-Function) 一进一出
- UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。Count/max/min
- UDTF(User-Defined Table-Generating Functions) 一进多出,如lateral view explore)
2. 函数类型
2.1. UDF(一进一出)
继承UDF类
重写evaluate方法
将该java文件编译成jar
2.2. UDAF(多进一出)
实现方法:
用户的UDAF必须继承了org.apache.hadoop.hive.ql.exec.UDAF;
用户的UDAF必须包含至少一个实现了org.apache.hadoop.hive.ql.exec的静态类,诸如实现了 UDAFEvaluator
一个计算函数必须实现的5个方法的具体含义如下:
init():主要是负责初始化计算函数并且重设其内部状态,一般就是重设其内部字段。一般在静态类中定义一个内部字段来存放最终的结果。
iterate():每一次对一个新值进行聚集计算时候都会调用该方法,计算函数会根据聚集计算结果更新内部状态。当输 入值合法或者正确计算了,则 就返回true。
terminatePartial():Hive需要部分聚集结果的时候会调用该方法,必须要返回一个封装了聚集计算当前状态的对象。
merge():Hive进行合并一个部分聚集和另一个部分聚集的时候会调用该方法。
terminate():Hive最终聚集结果的时候就会调用该方法。计算函数需要把状态作为一个值返回给用户。
部分聚集结果的数据类型和最终结果的数据类型可以不同。
2.3. UDTF(一进多出)
继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
initialize():UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)
process:初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward() 调用产生一行;如果产生多列 可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数
最后close()方法调用,对需要清理的方法进行清理
来自: https://blog.csdn.net/weixin_42181917/article/details/82865140
3. 加载函数的方式
3.1 使用add jar [classPath]语句(临时加载)
#加载jar
add jar [classPath]
#创建函数
create temporary function [functionName] as [calssPath]
这种方式不建议在生产环境中使用,通过该方式添加的jar文件只存在于当前会话中,当会话关闭后不能够继续使用该jar文件,最常见的问题是创建了永久函数到metastore中,再次使用该函数时却提示ClassNotFoundException。所以使用该方式每次都要使用add jar [classPath]语句添加相关的jar文件到classPath中。倒是可以用在临时使用函数的情况
3.2 修改hive-site.xml文件
修改参数hive.aux.jars.path的值指向UDF文件所在的路径。该参数需要手动添加到hive-site.xml文件中。
<property>
<name>hive.aux.jars.path</name>
<value>file:///[path],file:///[path]</value>
</property>
3.3 将jar包放入hive的jar目录(永久加载)
是在${HIVE_HOME}下创建auxlib目录,将UDF文件放到该目录中,这样hive在启动时会将其中的jar文件加载到classpath中。
或者 指定jar所在目录(这种反而更管理一点),实现:
可以拷贝${HIVE_HOME}/conf中的hive-env.sh.template 为 hive-env.sh 文件,并修改最后一行:
export HIVE_AUX_JARS_PATH=[classPath]
或者在系统中直接添加HIVE_AUX_JARS_PATH环境变量。
来自: https://blog.csdn.net/snail_bing/article/details/82869435