如何在Hive中創建自定義函數UDF及如何直接通過Impala的同步元數據重用UDF的jar文件

如何在Hive中創建自定義函數UDF及使用

如何在Impala中使用Hive的自定義函數

UDF函數開發

使用Intellij工具開發Hive的UDF函數,進行編譯;
1.使用Intellij工具通過Maven創建一個Java工程,並添加pom.xml依賴

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

2.Java示例代碼如下

import org.apache.hadoop.hive.ql.exec.UDF;
/**
 * @Auther:  截取2018023 前五位(簡單的udf對列的字符串處理)
 * @Date: 2019/3/11 10:00
 * @Description:
 */
public class SubStrUdf extends UDF {
    public static String evaluate(String str) {
        if(null == str || str.length()==0){
            return "";
        }else{
            return str.substring(0,5);
        }
    }
}

此處使用一個簡單的日期截取來做示例,注意此處需要集成UDF類,重寫evaluate方法,來實現自己定義函數。
3.編譯jar包
前提條件是已配置Maven的環境變量,命令行進入工程目錄,執行如下命令:

mvn clean package

或者
直接在IDE maven 的插件裏面進行打包

clean
package
install

3.Hive使用自定義函數(UDF)
將章節2中編譯好的sql-udf-demo-1.0.jar上傳到集羣服務器;
3.1創建臨時UDF
1.進入Hive的shell命令行,執行如下命令,創建臨時函數

hive> add jar /var/lib/hadoop-hdfs/sql-udf-demo-1.0.jar;
hive> create temporary function SubStrUdf as 'com.demo.hive.SubStrUdf';

2.在命令行測試該UDF函數

hive> select SubStrUdf (send_erp_time), send_erp_time from erp_goods.order_goods limit 10 ;
hive會進行分佈式的運算

3.2創建永久UDF
1.在HDFS中創建相應目錄,將sql-udf-demo-1.0.jar包上傳至該目錄

[hdfs@cdh21 ~]$ hadoop fs -mkdir /udf
[hdfs@cdh21 ~]$ hadoop fs -put sql-udf-demo-1.0.jar /udf

2.進入Hive的shell命令行,執行如下命令創建永久的UDF

hive> create function SubStrUdf as 'com.demo.hive.SubStrUdf' using jar  'hdfs://cdh21:8020/udf/sql-udf-demo-1.0.jar';

注意:在創建的時候如果帶有數據庫名,則該UDF函數只對該庫生效,其它庫無法使用該UDF函數。
在命令行測試該函數是否可用,測試與上面一樣
3.驗證永久UDF函數是否生效
重新打開Hive CLI能正常使用創建的UDF函數。

hive> select SubStrUdf (send_erp_time), send_erp_time from erp_goods.order_goods limit 10 ;

4.Impala使用Hive的UDF(直接使用hive中的java的jar文件中函數,同步元數據即可,可以直接複用哦)
1.在Impala shell命令行執行元數據同步命令

impala> invalidate metadata;

測試:
重新同步元數據之後再次進行測試:
注意,如果這邊在第一個impala-shell進去的時候,同步元數據之後還是不能使用hive創建的UDF函數的話,關閉客戶端連接,重新進入就可以使用了
刪除UDF函數命令:

impala> drop function SubStrUdf;

且重啓也生效

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