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方法才能實現刪除功能。