步骤
1、继承 Hive 提供的类org.apache.hadoop.hive.ql.udf.generic.GenericUDForg.apache.hadoop.hive.ql.udf.generic.GenericUDTF;2、 实现类中的抽象方法3、在 hive 的命令行窗口创建函数添加 jar :add jar linux_jar_path创建 function :create [temporary] function [dbname.]function_name AS class_name;4、在 hive 的命令行窗口删除函数drop [temporary] function [if exists] [dbname.]function_name;
自定义UDF函数
1、创建一个 Maven工程:Hive
2、导入依赖
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies>
3、创建一个类
package com.atguigu.hive;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
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.PrimitiveObjectIn
spectorFactory;
/**
*自定义UDF函数,需要继承GenericUDF类
*需求:计算指定字符串的长度
*/
public class MyStringLength extends GenericUDF {
/**
*
* @param arguments输入参数类型的鉴别器对象
* @return返回值类型的鉴别器对象
* @throws UDFArgumentException
*/
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws
UDFArgumentException {
//判断输入参数的个数
if(arguments.length !=1){
throw new UDFArgumentLengthException("Input Args Length
Error!!!");
}
//判断输入参数的类型
if(!arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)
){
throw new UDFArgumentTypeException(0,"Input Args TypeError!!!");
}
//函数本身返回值为int,需要返回int类型的鉴别器对象
return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
}
/**
*函数的逻辑处理
* @param arguments输入的参数
* @return返回值
* @throws HiveException
*/
@Override
public Object evaluate(DeferredObject[] arguments) throws
HiveException {
if(arguments[0].get() == null){
return 0;
}
return arguments[0].get().toString().length();
}
@Override
public String getDisplayString(String[] children) {
return "";
}
}