Hive--->建立自定義的UDTF函式

飝鱻.發表於2020-11-27

Hive--->建立自定義的UDTF函式

匯入依賴

  • 只需要倒入一個依賴即可
    <dependencies>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>

程式碼部分

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;

/**
 * 一進多出
 * 輸入資料:a,b,c,d
 * 輸出資料:a
 * b
 * c
 * d
 */
public class UDTFTest01 extends GenericUDTF {
    //輸出資料的集合
    private ArrayList<String> list = new ArrayList<>();

    //初始化方法
    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
        //輸出資料的預設列名,可以被別名覆蓋
        List<String> names = new ArrayList<>();
        names.add("word");
        //輸出資料的型別
        List<ObjectInspector> fieldOIs = new ArrayList<>();
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        StructObjectInspector outputOI = ObjectInspectorFactory.getStandardStructObjectInspector(names, fieldOIs);
        return outputOI;
    }

    //處理輸入資料的方法
    @Override
    public void process(Object[] objects) throws HiveException {
        //提取輸出資料
        String input = objects[0].toString();
        String string = objects[1].toString();
        //分割
        String[] word = input.split(string);
        //遍歷陣列
        for (int i = 0; i < word.length; i++) {
            //清空集合
            list.clear();
            //將資料存入集合
            list.add(word[i]);
            //輸出集合
            forward(list);
        }
    }

    //收尾方法
    @Override
    public void close() throws HiveException {

    }
}

建立函式

  1. 將jar包傳入叢集
  2. 開啟hive並且匯入jar包(如果將jar包直接放入hive的lib目錄的話,這一步可忽略)add jar jar_path
  3. 在hive中建立函式create function function_name as 'class_path'function_name是為你自定義的函式取名,class_path是class檔案的路徑
  4. 如果不想使用可以刪除函式drop function function_name

相關文章