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

因爲不經常用到所以用戶定義的聚合函數就不操作了;

 

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