1. 程式人生 > 其它 >Hive---自定義函式

Hive---自定義函式

技術標籤:Hivehive資料庫大資料javahadoop

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:用來關閉資源
  • 操作練習
    在這裡插入圖片描述