老API是继承UDF,编写evaluate方法,实现函数功能
案例:编写函数实现给定一个字符串,输出其长度。
注意:这里的evaluate方法的方法名不能写别的名字,只能写死
public class MyUDF extends UDF {
public int evaluate(String input){
if (input == null){
return 0;
}
return input.length();
}
}
之后利用Maven将代码打包后上传到hive安装目录下的lib下边(可以选择重启hive,或者热添加的方式让jar包生效)
//热添加
add jar /opt/module/hive/lib/jar包包名;
之后编写函数,利用jar包里的类实现函数功能
create temporary function my_len as "com.hive.MyUDF"
//双引号引起来的是类的reference路径
函数编写后就可以在SQL语句中使用函数了。
例子:查询员工表的name字段的name字符长度
select
name,my_len(name)
from
emp;
新API
public class MyNewUDF extends GenericUDF{
/**
* 初始化方法:对输入的方法做检查,以及约束输出的类型
* @param objectInspectors 输入参数的检查器
* @return 输出的参数检查器
* @throws UDFArgumentException
*/
@Override
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
if(objectInspectors.length != 1){
throw new UDFArgumentLengthException("Wrong Arguments Count!");
}
if (!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){
throw new UDFArgumentException("Wrong Argument Type!");
}
//返回值的类型为int
return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
}
/**
* 实现逻辑的方法
* @param deferredObjects
* @return
* @throws HiveException
*/
@Override
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
Object o = deferredObjects[0].get();
if (o == null){
return 0;
}
return o.toString().length();
}
/**
* 如果方法的执行中出现了问题返回的字符串
* @param strings
* @return
*/
@Override
public String getDisplayString(String[] strings) {
return "";
}
}