一、总结步骤
UDF
(1)UDF继承 org.apache.hadoop.hive.ql.exec.UDF
(2)需要实现 evaluate 函数;evaluate 函数支持重载;
(3)在集群使用(将jar包放到hive的lib包下)
添加 jar
创建 function(可以创建临时使用)
使用 function
删除function
UDTF
(1)UDTF继承 org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
(2)需要实现 initialize,process,close三个 函数
(3)在集群使用(同上 不累赘)
二、详细步骤
UDF(User-Defined-Function)函数,一进一出
注意事项:UDF 必须要有返回类型,可以返回 null,但是返回类型不能为 void
依赖文件
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.3.6</version>
</dependency>
案例
package com.ouyangl.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
/**
* @author oyl
* @create 2020-11-23 22:51
* @Description 自定义UDF 一进一出,函数名只能是evaluate
*/
public class MyUDF extends UDF {
public int evaluate(int data){
return data*2;
}
public int evaluate(int data, int data2){
return (data+data2)*2;
}
}
添加 jar add jar linux_jar_path(jar包放到hive的lib目录下)
add jar /opt/module/apache-hive-2.3.6-bin/lib/bigdata-hive-1.0-SNAPSHOT.jar
添加成功如图
创建 function
create [temporary] function [dbname.]function_name AS class_name;
[temporary]临时使用,[dbname.]某个库下,不支持垮库使用
create function test_db.addudf as "com.ouyangl.hive.udf.MyUDF";
使用 function
删除 function
drop [temporary] function [if exists] [dbname.]function_name;
drop function test_db.addudf
UDTF(User-Defined Table-Generating Functions)函数,一进多出
如 lateral view explore()
依赖文件同上不累赘
案列
package com.ouyangl.hive.udtf;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import java.util.ArrayList;
import java.util.List;
/**
* @author oyl
* @create 2020-11-24 21:36
* @Description 自定义UDTF 一进多出,
*/
public class MyUDTF extends GenericUDTF {
private ArrayList<String> outList = new ArrayList<>();
@Override
public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
//1.定义输出数据的列名和类型
List<String> fieldNames = new ArrayList<>();
List<ObjectInspector> fieldOIs = new ArrayList<>();
//2.添加输出数据的列名和类型,可以被使用时的别名覆盖
fieldNames.add("lineToWord");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
}
@Override
public void process(Object[] objects) throws HiveException {
//1.获取原始数据
String object = objects[0].toString();
//2.获取数据传入的第二个参数,此处为分隔符
String splitKey = objects[1].toString();
//3.将原始数据按照传入的分隔符进行切分
String[] fields = object.split(splitKey);
//4.遍历切分后的结果,并写出
for (String field : fields) {
//集合为复用的,首先清空集合
outList.clear();
//将每一个单词添加至集合
outList.add(field);
//将集合内容写出
forward(outList);
}
}
@Override
public void close() throws HiveException {
}
}
添加,创建,使用,删除同上
UDTF使用如图
三、依赖报错
Could not find artifact org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde
需要自己去下载然后放到自己的maven仓库的org\pentaho\pentaho-aggdesigner-algorithm\5.1.5-jhyde中