1.udf:user defined function:用户定义(普通)函数,只对单行数值产生作用;由于udf不做聚合,所以它可任意嵌套。
特点:input:output=1:1
实例函数:md5,split,ltrim
应用场景:1:1的情况,比如md5...
实现方法:简单udf实现
extends UDF
方法名 evaluate
eg:
/** * @function 自定义UDF统计最小值
* @author John
*
*/
public class Min extends UDF {
public Double evaluate(Double a, Double b) {
if (a == null)
a = 0.0;
if (b == null)
b = 0.0;
if (a >= b) {
return b;
} else {
return a;
}
}
}
2.udaf:user defined aggregation function:用户定义聚合函数,可对多行数据产生作用;
特点: input:output=n:1
示例函数:sum,count,max,min......
实现方法涉及的两个类:AbstractGenericUDAFResolver、GenericUDAFEvaluator;
实现方法:extends UDAFResolver类,重写 getEvaluator() 方法;内部静态类实现接口UDAFEvaluator;继承GenericUDAFEvaluator类,生成实例给getEvaluator();
五大方法(在GenericUDAFEvaluator类中,重写5大方法):
①init:初始化map或是reduce需用到的变量。
②iterate:迭代处理每条数据,true。
③terminatePartial:相当于mr的combiner。
④merge:其输入一定是terminatePartial的输出。
⑤terminate:处理的是merge的结果。
eg:
SELECT
store_name, SUM(sales)
FROM
Store_Information
GROUP BY
store_name
HAVING
SUM(sales) > 1500
ORDER BY
SUM(sales);
关键字HAVING总要放在GROUP BY之后,ORDER BY之前;
3.udtf:user defined table function:用户定义表生成函数,用来解决输入一行输出多行;
特点:input:output=1:n
示例函数:explode、lateral view explore
实现方法:udf+explode;继承GenericUDTF类,重写initialize(返回输出行信息:列个数,类型), process, close三方法;