注释: 在Hive中,用户可以自定义一些函数,用于扩展HiveQL的功能,而这类函数叫做UDF(用户自定义函数)。
UDF分为两大类:UDAF(用户自定义聚合函数)和UDTF(用户自定义表生成函数)。
实际上Hive内置了很多函数,包括关系/算数/逻辑操作符都属于函数
hive提供的build-in函数包括以下几类:
1. 关系操作符:包括 = 、 <> 、 <= 、>=等
2. 算数操作符:包括 + 、 - 、 *、/等
3. 逻辑操作符:包括AND 、 && 、 OR 、 || 等
4. 复杂类型构造函数:包括map、struct、create_union等
5. 复杂类型操作符:包括A[n]、Map[key]、S.x
6. 数学操作符:包括ln(double a)、sqrt(double a)等
7. 集合操作符:包括size(Array)、sort_array(Array)等
8. 类型转换函数: binary(string|binary)、cast(expr as )
9. 日期函数:包括from_unixtime(bigint unixtime[, string format])、unix_timestamp()等
10.条件函数:包括if(boolean testCondition, T valueTrue, T valueFalseOrNull)等
11. 字符串函数:包括acat(string|binary A, string|binary B…)等
12. 其他:xpath、get_json_objectscii(string str)、con
HiveUDF添加主要分成两种方式
1,重编译Hive源码添加:添加UDF可以在Hive源码中增加新的UDF类,然后在一个FunctionRegistry类中注册,重编译Hive然后使用
2,通过命令行添加:独立开发UDF,将UDF打包成jar,通过Hive命令行添加到系统中(实际上是调用了FunctionRegistry中的方法),于是产生了第三发UDF项目,如[Brickhouse](https://github.com/klout/brickhouse)
添加又分为临时和永久,临时适合于测试,当会话结束,函数会消失,永久添加会稳定添加到Hivemetastore中,重启会话然存在。
1,永久
create function function_name AS ‘full.class.name’ using JAR ‘jar/absolute/path’;
2,临时
ADD JAR hdfs://hive/warehouse/udf/brickhouse-0.7.1-SNAPSHOT.jar;
CREATE TEMPORARY FUNCTION to_json AS ‘brickhouse.udf.json.ToJsonUDF’;
CREATE TEMPORARY FUNCTION combine_unique AS ‘brickhouse.udf.collect.CombineUniqueUDAF’;
实现方法:
1. 继承UDF类
2. 重写evaluate方法
3. 将该java文件编译成jar
4. 在终端输入如下命令:
hive> add jar test.jar;
hive> CREATE FUNCTION p2p.encode AS 'com.lefinace.hive.udf.EncodeUDF' USING JAR 'hdfs:///user/lefin/oozie-oozi/udf/LefHiveUtilsl-Hive-1.3-SNAPSHOT.jar';
hive> drop temporary function function_name;
实现方法:
1,用户的UDAF必须继承了org.apache.hadoop.hive.ql.exec.UDAF;
2,用户的UDAF必须包含至少一个实现了org.apache.hadoop.hive.ql.exec的静态类,诸如实现了 UDAFEvaluator
3,一个计算函数必须实现的5个方法的具体含义如下:
init():主要是负责初始化计算函数并且重设其内部状态,一般就是重设其内部字段。一般在静态类中定义一个内部字段来存放最终的结果。
iterate():每一次对一个新值进行聚集计算时候都会调用该方法,计算函数会根据聚集计算结果更新内部状态。当输 入值合法或者正确计算了,则 就返回true。
terminatePartial():Hive需要部分聚集结果的时候会调用该方法,必须要返回一个封装了聚集计算当前状态的对象。
merge():Hive进行合并一个部分聚集和另一个部分聚集的时候会调用该方法。
terminate():Hive最终聚集结果的时候就会调用该方法。计算函数需要把状态作为一个值返回给用户。
4.部分聚集结果的数据类型和最终结果的数据类型可以不同。
实现方法:
1. 继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
2.initialize():UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)
3.process:初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward() 调用产生一行;如果产生多列 可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数
4.最后close()方法调用,对需要清理的方法进行清理