Hive---自定義函式
阿新 • • 發佈:2021-01-08
Hive---自定義函式
- hive的自定義函式大致可以分為三種
UDF (User-Defined-Function):一進一出
UDAF (User-Defined Aggregation Function):多進一處,型別於聚合函式
UDTF (User-Defined Table-Generating Functions):一進多出
自定義UDF函式
編寫一個函式。會將輸入的數字加上5然後輸出
import org.apache.hadoop.hive.ql.exec.UDF;
public class myUDF extends UDF {
public int evaluate(int data) {
return data + 5;
}
}
- 注意事項
自定義的UDF函式類必須繼承UDF類
自定義的UDF函式必須實現evaluate方法
自定義的UDF函式的evaluate必須有返回值,返回值是null也可以,但是必須要有
自定義的UDF函式的evaluate方法可以過載 - 自定義函式的使用
將jar包匯入hive中:add jar /home/hive-1.0-SNAPSHOT.jar
建立函式:create function hive.addFive as 'Hive.myUDF'
注意:函式在建立的時候可以指定資料庫,不指定的話,預設就是當前資料庫,自定義函式不可以跨庫使用 - 自定義函式的使用
自定義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;
import java.util.List;
public class myUDTF extends GenericUDTF {
private List<String>dataList = new ArrayList<>();
/**
* 初始化方法
*
* @param argOIs
* @return
* @throws UDFArgumentException
*/
@Override
public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
//炸裂,這是集合,說明炸裂可以分成多個列
List<String> fieldNames = new ArrayList<>();
//將欄位起別名為word
fieldNames.add("word");
//這儲存的是這列的資料型別,這個資料型別是和資料有關
List<ObjectInspector> fieldOIs = new ArrayList<>();
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
//這裡是輸出的欄位名還有資料型別,不寫的話有別名,並且這個欄位名可以被覆蓋
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
}
/**
* 處理資料,按行來
*
* @param objects
* @throws HiveException
*/
@Override
public void process(Object[] objects) throws HiveException {
//接受的是個陣列
//獲取資料
String data = objects[0].toString();
//獲取分割符
String splitKey = objects[1].toString();
//切分資料
String[] words = data.split(splitKey);
//寫出資料
for (String word : words) {
//資料集合清空
dataList.clear();
//遍歷寫出每一個分割後的資料
//因為上出的列是集合,資料型別要匹配,這裡寫出的也應該是集合
dataList.add(word);
forward(dataList);
}
}
@Override
public void close() throws HiveException {
}
}
- 注意點
自定義UDTF有三個方法:initialize、process、close
initialize:初始化方法,用來定義欄位名,和欄位的資料型別,或者來判斷輸入的引數是否符合要求
process:用來處理資料,一行一行的讀取資料
close:用來關閉資源 - 操作練習