1、自定义函数的分类----表示输入输出的行数
UDF:一进一出
UDAF:多进一出
UDTF:一进多出
2、自定义函数UDF(一对一)参数给可变参数,进去多个还是出一个
(1)导包
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
(2)定义一个类继承org.apache.hadoop.hive.ql.exec.UDF
(3)需要自定义函数evaluate写入实现逻辑
public class Demo03 extends UDF {
//传入一个参数
public String evaluate(String string){
//加入处理的逻辑
String s="start--"+string+"--end";
return s;
}
}
(4)将Java到吗打包上传到hadoop
(5)进入hive客户端,添加jar包: add jar /usr/local/data/hiveproject-1.0-SNAPSHOT.jar
(上一步打的Jar包)
(6)注册:创建临时函数,就是给定义的函数方法一个名字 hive> create temporary function a as ‘demo0
.Demo03’ (全类名)
3、UDTF自定义函数(一对多)
(1)定义类继承GenericUDTF,实现里面的方法
(2)java操作代码
public class Demo04UDTF extends GenericUDTF {
/**
* 初始化,将一行数据转换成列时,列的字段,类型等等信息
* 数据输出的格式
*/
@Override
public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
//操作列的名称
ArrayList<String> fileName = new ArrayList<String>();
//操作列的类型
ArrayList<ObjectInspector> fileType = new ArrayList<ObjectInspector>();
fileName.add("x");
fileType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fileName.add("y");
fileType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fileName,fileType);
}
public void process(Object[] objects) throws HiveException {
//传入的数据 k1:v1,k2:v2,k3:v3;
String string = objects[0].toString(); //数据转换为string
String[] split = string.split(","); //切一个一个kv
for (String s : split) {
String[] split1 = s.split(":"); //且一个一个元素k和v
forward(split1); //放入一个数组,输出
}
}
public void close() throws HiveException {
//关闭
}
}
public class Demo05UDTF extends GenericUDTF {
@Override
public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
//操作列的名称
ArrayList<String> fileName = new ArrayList<String>();
//操作列的类型
ArrayList<ObjectInspector> fileType = new ArrayList<ObjectInspector>();
fileName.add("x");
fileType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fileName,fileType);
}
public void process(Object[] objects) throws HiveException {
//输入数据为123,456,789
String string = objects[0].toString();
String[] split = string.split(",");
for (String s : split) {
//输出数据只能是数组
String[] split1 = s.split(",");
forward(split1);
}
}
public void close() throws HiveException {
}
}