hive之自定义函数

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等等

因为不经常用到所以用户定义的聚合函数就不操作了;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章