hive之自定义函数
Hive的自定义函数(是Java语言):类似数据库的存储过程
类型:
(1)UDF函数:用户自定义函数 user define function
(*)拼加字符串,实现SQL的concat函数
(*)根据员工薪水,判断薪水的级别
sal <1000,返回“Grade A”
1000<= sal < 3000,返回“Grade B”
sal >=3000 返回“Grade C”
在编程之前需要将hive的lib包下的所有jar包导入到工程当中
然后写程序
package demo.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Mycontact extends UDF
{
//重写一个方法:相当于执行SQL
public String evaluate(String a,String b) {
return a.toString() + "*****" + b.toString();
}
}
package demo.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class CheckSalaryGrade extends UDF
{
public String evaluate(String a) {
int sal=Integer.valueOf(a);
if(sal < 1000) return "Grade A";
else if(sal>=1000 && sal< 3000) return "Grade B";
else return "Grade C";
}
}
然后把这俩个程序导出成jar包,并上传到服务骑上
在hive命令行下把jar包添加到hive中add jar /root/training/udf1.jar;
再给我们写的类定义别名
create temporary function mycontact as 'demo.udf.Mycontact';
create temporary function checkgrade as 'demo.udf.CheckSalaryGrade';
使用我们自定义的函数进行查询
(2)UDTF: 用户定义表生成函数 user define table function
这个是用于已经存在的数据然后生成表(比如由etl抽取出来的数据不是你的数据格式,你可以使用这个来调整一下就可以了)
package demo.udtf;
import java.util.List;
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 com.google.common.collect.Lists;
public class MytableUDTF extends GenericUDTF
{
//得到原始数据的结构
@Override
public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
//得到原始数据的结构
//列名
List<String> columnNames = Lists.newLinkedList();
columnNames.add("tid");
columnNames.add("key");
columnNames.add("value");
//列的类型:ObjectInspector
List<ObjectInspector> columnTypes = Lists.newLinkedList();
columnTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
columnTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
columnTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
//返回原始数据的结构
return ObjectInspectorFactory.getStandardStructObjectInspector(columnNames, columnTypes);
}
@Override
public void process(Object[] args) throws HiveException {
// 如何生成新表和数据
if(args.length != 3) {
//非法数据
return;
}
String id = args[0].toString();
//得到所有的key:name,age,gender
String[] keyList = args[1].toString().split(",");
//得到key的value:Tom,24,Male
String[] valueList = args[2].toString().split(",");
for(int i=0;i<keyList.length;i++) {
String[] list = {id,keyList[i],valueList[i]};
this.forward(list);
}
}
@Override
public void close() throws HiveException {
// TODO Auto-generated method stub
}
}
(3)UDAF:用户定义聚合函数,标准:sum、avg、max、min等等
因为不经常用到所以用户定义的聚合函数就不操作了;