hive扩展函数开发规范

提供以下两种实现方式:a继承org.apache.hadoop.hive.ql.exec.UDF

代码包为:packageorg.apache.hadoop.hive.ql.udf

实现evaluate方法,根据输入参数和返回参数类型,系统自动转换到匹配的方法实现上。

例如:

•    UDFTestLength.java:

importorg.apache.hadoop.io.IntWritable;

importorg.apache.hadoop.io.Text;

public classUDFTestLength extends UDF {

  IntWritable result = new IntWritable();

  public IntWritable evaluate(Text s) {

    if (s== null) {

      return null;

    }

    result.set(countUDF8Characters(s));

    return result;

  }

}

b继承org.apache.hadoop.hive.ql.udf.generic.GenericUDF

代码包为:packageorg.apache.hadoop.hive.ql.udf. generic

实现initialize ,evaluate,    getDisplayString方法

例如:

@Description(name = "url_to_map", value = "_FUNC_(text,delimiter1, delimiter2) - "      

public class GenericUDFUrlToMap extends GenericUDF{

HashMap<Object,Object> ret = new HashMap<Object, Object>();

@Override

public ObjectInspector initialize(ObjectInspector[]arguments)

        throwsUDFArgumentException {

     … …

     returnObjectInspectorFactory.getStandardMapObjectInspector(

            PrimitiveObjectInspectorFactory.javaStringObjectInspector,

            PrimitiveObjectInspectorFactory.javaStringObjectInspector);

}

@Override

public Object evaluate(DeferredObject[]arguments) throws HiveException {

     ret.clear();

     … …

     return ret;

}

@Override

public String getDisplayString(String[]children) {

     StringBuildersb = new StringBuilder();

     sb.append("url_to_map(");

     assert (children.length <= 3);

     boolean firstChild = true;

     for (String child :children) {

        if (firstChild) {

            firstChild= false;

        }else {

            sb.append(",");

        }

        sb.append(child);

     }

     sb.append(")");

     return sb.toString();

}

}

扩展函数写完后需要统一注册到FunctionRegistry中,发布后成为系统函数;

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:hive扩展函数开发规范

你可能感兴趣的:(hadoop,hive,超人学院)