hive使用UDF函數

官方關於UDF的使用介紹:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF


UDF幾個相關概念:

    UDF: one-to-one row mapping : upper substr【進來一行出去一行】

    UDAF: Aggregation   Many-to-one row mapping   比如sum/min【進來多行出去一行】

    UDTF: Table-generating  one-to-many    比如:lateral view explode()【一對多】


編寫UDF函數測試代碼:

pod.xml添加hive:

<!--添加hive依賴-->
<hive.version>1.1.0-cdh5.7.0</hive.version>

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>${hive.version}</version>
</dependency>

HelloUDF.java:

package com.ruozedata.hadoop.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

public class HelloUDF extends UDF{
    public String evaluate(String input) {
        //TODO...此處爲開發業務邏輯的地方
        return "Hello:" + input;
    }

    //下面爲測試代碼
    public static void main(String[] args) {
        HelloUDF udf = new HelloUDF();
        String output = udf.evaluate("測試數據");
        System.out.println(output);
    }
}
注:實現UDF函數的套路是一樣的,第一步繼承UDF函數,第二步重寫evaluate方法

在idea中用maven打包後,上傳到hive服務器;包名爲:g6-hadoop-udf.jar


hive創建函數的幾種方式:

方法一:創建臨時函數(Temporary Functions)

    官方參考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateFunction

    缺點:Temporary Functions只對當前 session(窗口)有效   


    示例:在Hive的Shell中執行

    ADD JAR /home/hadoop/lib/g6-hadoop-udf.jar;

    CREATE TEMPORARY FUNCTION sayHello AS 'com.ruozedata.hadoop.udf.HelloUDF';

    

    show functions;(執行此語句,可以看到sayHello在函數中)

    select sayhello('abc') from dual;(輸出的結果爲:Hello:abc)

    注:此種方式還有一個缺點是,jar需要每次手動add才能識別class_name

方法二:無需手動add jar包

    在hive的家目錄下創建auxlib目錄,把jar包放在此目錄下即可;

    不管創建臨時函數,還是持久函數,把jar放入auxlib後就無需手動進行加載;

方法三:創建持久函數(Permanent Functions),並且使用hdfs上的jar;生產建議此種方式

    從hive 0.13開始,支持將函數註冊到metastore中,存放的表爲FUNCS(裏邊默認爲空);

    image.png

    

    將jar包放在hdfs的/lib目錄下;

    

    示例:在Hive的Shell中執行以下命令

CREATE FUNCTION sayhello2 AS 'com.ruozedata.hadoop.udf.HelloUDF' USING JAR 'hdfs://ruozeclusterg6/lib/g6-hadoop-udf.jar';

    注:此時可以任何窗口使用sayhello2函數(使用show functions無法查到,但在元數據的FUNCS表中可以看到)


    查看mysql中hive庫的FUNCS表;發現sayhello2已成功進行註冊;

    image.png

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