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等等
因爲不經常用到所以用戶定義的聚合函數就不操作了;