Hive中的用戶自定義函數


1.1 關於自定義函數

1)Hive 自帶了一些函數,比如:max/min等,但是數量有限,自己可以通過自定義UDF來方便的擴展。

2)當Hive提供的內置函數無法滿足你的業務處理需要時,此時就可以考慮使用用戶自定義函數(UDF:user-defined function)。

3)根據用戶自定義函數類別分為以下三種:

​ (1)UDF(User-Defined-Function)

​ 一進一出

​ (2)UDAF(User-Defined Aggregation Function)

​ 聚集函數,多進一出

​ 類似於:count/max/min

​ (3)UDTF(User-Defined Table-Generating Functions)

​ 一進多出

​ 如lateral view explore()

4)官方文檔地址

https://cwiki.apache.org/confluence/display/Hive/HivePlugins

5)編程步驟:

​ (1)繼承org.apache.hadoop.hive.ql.exec.UDF

​ (2)需要實現evaluate函數;evaluate函數支持重載;

​ (3)在hive的命令行窗口創建函數

​ a)添加jar

add jar linux_jar_path

​ b)創建function

create [temporary] function [dbname.]function_name AS class_name;

​ (4)在hive的命令行窗口刪除函數

Drop [temporary] function [if exists] [dbname.]function_name;

6)注意事項

​ (1)UDF必須要有返回類型,可以返回null,但是返回類型不能為void;

1.2 案例實操

1)定義了四個UDF類,代碼見:GitHub

使用方法:你可以選擇在IDEA中checkout該項目,然后使用maven打成jar包后放置到hive的安裝目錄,“hive/lib”目錄下

如:

2)在hive中執行add操作,添加所配置的jar包:

hive (default)> add jar /opt/module/hive/lib/log-hive.jar;

3)注冊永久函數

hive (default)>create function getdaybegin AS 'com.bigdata.hive.DayBeginUDF';

hive (default)>create function getweekbegin AS 'com.bigdata.hive.WeekBeginUDF';

hive (default)>create function getmonthbegin AS 'com.bigdata.hive.MonthBeginUDF';

hive (default)>create function formattime AS 'com.bigdata.hive.FormatTimeUDF';

4)驗證函數

​ 由於我將Hive的元數據信息選擇保存在MySQL中(Hive的Metastore默認存儲在自帶的derby數據庫中,推薦使用MySQL存儲Metastore),所以選擇登錄mysql

[bigdata@hadoop101 ~]$ mysql -uroot -p000000

mysql> show databases;

mysql> use metastore;

mysql> show tables;

mysql> select * from FUNCS;

下面是我在Dbeaver中查看到的表的具體信息:

可以發現四個自定義函數已經添加進去了。

關於FUNC表字段的描述:

5)刪除函數

hive (applogsdb)> drop function getdaybegin;

hive (applogsdb)> drop function getweekbegin;

hive (applogsdb)> drop function getmonthbegin;

hive (applogsdb)> drop function formattime;

6)注意:在哪個數據庫中注冊的永久函數,必須在哪個數據庫下將該方法刪除

比如在applogsdb數據庫中創建的方法,必須在該數據中調用drop方法才能實現刪除功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM