HIVE中的函数分类
UDF(一进一出)
UDAF (多进一出)(count/max/min)聚合函数
UDTF(一进多出)视图
自定义函数写法
创建一个Maven工程后导入依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.1.0</version>
</dependency>
可以在
pom.xml 的build 中添加 finalName
此时package的包名就是finalName
<build>
<finalName>fun</finalName>
</build>
UDF
import org.apache.hadoop.hive.ql.exec.UDF;
/**
* @ues 将输入字符串首字母大写函数代码
*/
public class InitUpper extends UDF {
public String evaluate(final String txt){
return txt.substring(0,1).toUpperCase()+txt.substring(1);
}
}
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;
/**
* @ues 数据进入时是一个array输出时为一个表
*/
public class splitMap extends GenericUDTF {
//产生语句翻译后的表结构
@Override
public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
ArrayList<String> colums=new ArrayList<String>();
ArrayList<ObjectInspector> colType =new ArrayList<ObjectInspector>();
//第一列字段名
colums.add("col1");
//第一列结构类型
colType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
colums.add("col2");
colType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(colums,colType);
}
//处理方法
@Override
public void process(Object[] objects) throws HiveException {
//例如:获得['name:zx','age:50']
String[] datas = objects[0].toString().split(",");
String[] res=new String[2];
//将张三放到数组第一个
res[0]=datas[0].split(":")[1];
res[1]=datas[1].split(":")[1];
//将数据塞入表
forward(res);
}
@Override
public void close() throws HiveException {
}
}
UDAF
在写UDAF函数时 方法名不可变
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
/**
* @ues 将字符串连成一行 多进一出 依靠内部类加工
*/
public class LinkStr extends UDAF {
private static String result="";
public static class cmLink implements UDAFEvaluator{
@Override
public void init() {
}
//聚合 作为mapper一部分 也做reduce的事
public boolean iterate(String name){
result=result.concat(name);
return true;
}
//combiner 分割方法
public String terminatePartial(){
return result;
}
// 相当于partition
// 多行数据分开 交个iterate
public boolean merge(String name){
return iterate(name);
}
//reduce 可以不用干
public String terminate(){
return result;
}
}
}
在hive中添加函数
1.将代码打瘦包 package
2.将jar包传到linux中
3.在hive中add jar包
add jar /opt/fun.jar
4.添加函数
在IDEA中Ctrl+Alt+Shift+c四键复制类的全类名
临时函数 方法名 类名(程序入口)
create temporary function iu as 'cn.kgc.udf.InitUpper';
删除函数
drop temporary function iu
5.测试
达到了首字母大写的效果