美文网首页我爱编程
Hive自定义UDF函数

Hive自定义UDF函数

作者: IT_小白 | 来源:发表于2018-07-25 15:26 被阅读0次

    你要写的查询有事无法轻松或是(无法完成)的查询任务,使用Hive内置函数来标识。

    通过编写用户自定义函数(user-defind function,UDF),Hive可以方便地插入用户写的处理代码并在查询中调用他们。

    UDF支持的编程语言:Java(只支持Java)

    Hive本身也是Java编写的。对于其他编程语言,可以考虑使用SELECT TRANSFORM 查询,

    有了它,可以让数据流经用户自定义的脚本。

    Hive中有三种UDF:(普通)UDF、用户定义聚集函数(user-defind aggregate function,UDAF)

    以及用户自定义表生成函数(user-defind generating function,UDTF)。

    自定义UDF函数 去除字符串尾字符的UDF:

    package com.ht.hive;

    import org.apache.commons.lang.StringUtils;

    import org.apache.hadoop.hive.ql.exec.UDF;

    import org.apache.hadoop.io.Text;

    /**

    * Created by MAIBENBEN on 2018/7/5.

    */

    public class Stripextends UDF {

    public static void main(String[] args) {

    Strip hive =new Strip();

    Text evaluate = hive.evaluate(new Text("asd"),"sd");

    System.out.println(evaluate.toString());

    }

    private Textresult =new Text();

    public Text evaluate(Text str) {

    if (null == str) {

    return null;

    }

    result.set(StringUtils.strip(str.toString()));

    return result;

    }

    public Text evaluate(Text str, String stripChars) {

    if (null == str) {

    return null;

    }

    result.set(StringUtils.strip(str.toString(), stripChars));

    return result;

    }

    }

    一个UDF函数必须满足下面两个条件:

                1、一个UDF必须是    org.apache.hadoop.hive.ql.exec.UDF 的子类

                2、 一个必须;至少实现了evaluate() 方法

    evaluate方法不是接口定义的,Hive会检查UDF,看是否能找到相匹配的evaluate方法。

    计算一组整数中最大的UDAF

    package com.ht.hive;

    import org.apache.hadoop.hive.ql.exec.UDAF;

    import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

    import org.apache.hadoop.io.IntWritable;

    /**

    * Created by MAIBENBEN on 2018/7/6.

    */

    public class Maximumextends UDAF {

    public static class MaximumIntUDAFEaluatorimplements UDAFEvaluator {

    private IntWritableresult;

    @Override

            public void init() {

    result =null;

    }

    public boolean iterate(IntWritable value) {

    if (null == value) {

    return true;

    }else {

    result.set(Math.max(result.get(), value.get()));

    }

    return true;

    }

    public IntWritable terminatePartial() {

    return result;

    }

    public boolean merge(IntWritable other) {

    return iterate(other);

    }

    public IntWritable terminate() {

    return result;

    }

    }

    }

    一个UDAF函数必须满足以下条件条件:

    一个UDAF必须是    org.apache.hadoop.hive.ql.exec.UDAF 的子类,并且包含一个或多个嵌套

    的、实现了    org.apache.hadoop.hive.ql.exec.UDAFEvaluator 的静态类。

    相关文章

      网友评论

        本文标题:Hive自定义UDF函数

        本文链接:https://www.haomeiwen.com/subject/vxdbuftx.html