自定义UDAF函数开发详解
UDAF 函数分为如下两部分:
一、负责检查数据类型(Resolver)
二、负责数据执行处理(Evaluator)
第一部分(Resolver)
Resolver 部分继承 AbstractGenericUDAFResolver类,之后只需要重载getEvaluator 方法,AbstractGenericUDAFResolver的源码如下:
public abstract class AbstractGenericUDAFResolver implements GenericUDAFResolver2 {
public AbstractGenericUDAFResolver() {
}
public GenericUDAFEvaluator getEvaluator(GenericUDAFParameterInfo info) throws SemanticException {
if (info.isAllColumns()) {
throw new SemanticException("The specified syntax for UDAF invocation is invalid.");
} else {
return this.getEvaluator(info.getParameters());
}
}
public GenericUDAFEvaluator getEvaluator(TypeInfo[] info) throws SemanticException {
throw new SemanticException("This UDAF does not support the deprecated getEvaluator() method.");
}
}
它根据SQL传入的参数类型,返回正确的evaluator。这里最主要是实现操作符的重载。
UDAF的第一部分代码为
public class GenericUDAFMedian extends AbstractGenericUDAFResolver {
@Override
public GenericUDAFEvaluator getEvaluator(TypeInfo[] parameters)
throws SemanticException {
if(parameters.length != 1) {
throw new UDFArgumentTypeException(parameters.length-1, "Only 1 parameter is accepted!");
}
ObjectInspector objectInspector = TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(parameters[<