Hive自定义函数(UDF)

UDF:User-Defined Function自定义函数

看下官方文档:

Hive自定义函数(UDF)_第1张图片

官方文档上说:UDF是一个自定义函数,和hive一起使用,一个新的UDF类需要继承UDF这个父类

org.apache.hadoop.hive.ql.udf.generic.GenericUDF

GenericUDF提供了更多的灵活性和更复杂的成本。

扩展该UDF类的要求是:实现一个或多个evaluate方法,该方法有hive调用,通过设置一个制定的UDFMethodResolver,可以配置解析要调用的方法的具体方法,

Hive自定义函数(UDF)_第2张图片

上面是UDF的一些类库,同时上面还说了,evaluate永远不应是是一个void 方法,当它有需要的可以返回一个null,返回的类型和方法参数可以是java类型的或者是hadoop类型的数据

该类的一个实例将在每个JVM中实例化,并且不会并发调用。

下面来看一个分割字符串的小案例:

public class CountToolUDF extends UDF {
    public IntWritable evaluate(Text votetools){
        String value = votetools.toString();
        if (StringUtils.isBlank(value)) {
            return new IntWritable(0);
        }
            int length = value.split(";").length;
            return new IntWritable(length);
    }
    public static void main(String[] args) {
        Text text = new Text("PyCharm;RapidMiner;Weka;Java;Python;SQL language;Open Source Hadoop Tools;SQL on Hadoop tools");
        System.out.println(new CountToolUDF().evaluate(text));
    }

}

由案例可以看出我自定义了UDF函数继承了UDF这个父类,并实现了它的方法都是 evaluate();同时呢我设置了返回值为hadoop的数据类型,这是有原因的:因为UDF要和hive一起使用,而hive是作用在hadoop上的,而且它执行的程序是MapReduce程序,省去了一个转化功能,减少了时间,节约了资源。如果用java的数据类型最后还需要转化成hadoop数据类型,这样不利于资源的节省。

 

你可能感兴趣的:(大数据)