Hive--->创建自定义的UDF文件
原创
©著作权归作者所有:来自51CTO博客作者飝鱻?的原创作品,请联系作者获取转载授权,否则将追究法律责任
导入依赖
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies>
代码部分
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
/**
*一进一出
*/
public class UDFTest01 extends GenericUDF {
/**
* 这是初始化方法,只执行一次
* 校验参数个数
* @param objectInspectors
* @return
* @throws UDFArgumentException
*/
@Override
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
if (objectInspectors.length!=1){
throw new UDFArgumentException("参数个数不为一");
}
//设置函数返回值的类型
return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
}
/**
* 处理方法,一条数据执行一次
* @param deferredObjects
* @return
* @throws HiveException
*/
@Override
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
//取出输入函数
String input = deferredObjects[0].get().toString();//强调,个体方法必须要写
//判断输入数据是否为空
if (input==null){
return 0;
}
//返回输入数据的长度
return input.length();
}
/**
* 执行计划,一般自定义的函数很少写执行计划,一般都是给空值
* @param strings
* @return
*/
@Override
public String getDisplayString(String[] strings) {
return "";
}
}
创建函数
- 将jar包传入集群
-
打开hive并且导入jar包(如果将jar包直接放入hive的lib目录的话,这一步可忽略)
add jar jar_path
-
在hive中创建函数
create function function_name as 'class_path'
function_name是为你自定义的函数取名,class_path是class文件的路径
-
如果不想使用可以删除函数
drop function function_name