Hive_Day05
自定义函数UDF
package com.shujia.custom.udfdemo;
import org.apache.hadoop.hive.ql.exec.UDF;
/*
1. 继承:org.apache.hadoop.hive.ql.exec.UDF
*/
public class MyUDFDemo1 extends UDF {
//传进去一个字符串类型的值,在值的后面拼接一个$符号
public String evaluate(String obj){
return obj+"$";
}
//需求:1000以下的 +500;1000~2000 +1000;2000以上 +1500
public int evaluate(int sal){
if(sal<=1000){
return sal+500;
}else if(sal<=2000){
return sal+1000;
}else {
return sal+1500;
}
}
}
package com.shujia.custom.udfdemo;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUDFDemo2 extends UDF {
public String evaluate(String obj){
return obj.toUpperCase();
}
}
-
打成jar包并上传至Linux虚拟机
-
在hive shell中,使用
add jar 路径
将jar包作为资源添加到hive环境中 -
使用jar包资源注册一个临时函数,fxxx1是你的函数名,'MyUDF’是主类名
-
add jar /usr/local/soft/bigdata19/hive-bigdata19-1.0-SNAPSHOT.jar; create temporary function fxxx1 as 'MyUDF';
-
上面的方法只是设置了一个临时函数,以下式设置永久的自定义函数的方法
-
将jar上传HDFS: hadoop fs -put hadoop-mapreduce-1.0-SNAPSHOT.jar /jar/ create function myUp as 'com.shujia.testHiveFun.udf.FirstUDF' using jar 'hdfs:/jar/hadoop-mapreduce-1.0-SNAPSHOT.jar'; create function bfy_fun as 'com.shujia.udfdemo.HiveTest' using jar 'hdfs:/shujia/bigdata19/jar/hive-udf.jar';
自定义函数的另一种写法
package com.shujia.custom.udfdemo;
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 MyUDFDemo3 extends GenericUDF {
String output = "";
/*
initialize方法做的是初始化,主要是设置输出的类型
PrimitiveObjectInspectorFactory去获取返回的数据类型
*/
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
output = "";
return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
}
/*
evaluate: 编写主要逻辑
*/
@Override
public Object evaluate(DeferredObject[] arguments) throws HiveException {
if(arguments.length==1){
String input = arguments[0].get().toString();
output = "数加: "+input+" 666";
}
return output;
}
@Override
public String getDisplayString(String[] children) {
return "这是自己编写的自定义函数UDF";
}
}