hive udf 使用方法
Hive系列文章
- Hive表的基本操作
- Hive中的集合數(shù)據(jù)類型
- Hive動態(tài)分區(qū)詳解
- hive中orc格式表的數(shù)據(jù)導入
- Java通過jdbc連接hive
- 通過HiveServer2訪問Hive
- SpringBoot連接Hive實現(xiàn)自助取數(shù)
- hive關聯(lián)hbase表
- Hive udf 使用方法
- Hive基于UDF進行文本分詞
- Hive窗口函數(shù)row number的用法
- 數(shù)據(jù)倉庫之拉鏈表
hive作為一個sql查詢引擎,自帶了一些基本的函數(shù),比如count
(計數(shù)),sum
(求和),有時候這些基本函數(shù)滿足不了我們的需求,這時候就要寫hive hdf(user defined funation)
,又叫用戶自定義函數(shù),應用與select
語句中。
哪些情況滿足不了我們的需求呢,比如:
- 需要將字段與數(shù)據(jù)庫中查詢一下,做個比對;
- 需要對數(shù)據(jù)進行復雜處理;
- 等等
hive udf 用法
下面是一個判斷hive表字段是否包含'100'的簡單udf
:
使用maven將其打包,進入hive cli
,輸入命令:
創(chuàng)建完臨時函數(shù),即可使用這個函數(shù)了:
hive udf 創(chuàng)建與使用步驟
- 繼承
org.apache.hadoop.hive.ql.exec.UDF
類,實現(xiàn)evaluate方法; - 打包上傳到集群,通過
create temporary function
創(chuàng)建臨時函數(shù),不加temporary
就創(chuàng)建了一個永久函數(shù); - 通過select 語句使用;
下面是一個例子,通過讀取mysql數(shù)據(jù)庫中的規(guī)則,為hive中的workflow返回對應的,類型:
type workflow
a 1
a 2
b 11
b 22
b 33
我們希望,將hive的某一個字段取值為,1,2的變?yōu)?code>a,取值為11,22,33的全部變?yōu)?code>b,就是歸類的意思。
這個udf可以這么實現(xiàn):
查看hive function的用法:
查month 相關的函數(shù)
查看 add_months 函數(shù)的用法
查看 add_months 函數(shù)的詳細說明并舉例
hive 中的 UDAF
可以看出,udf就是一個輸入一個輸出,輸入一個性別,返回'男'或者'女',如果我們想實現(xiàn)select date,count(1) from
table,統(tǒng)計每天的流量呢?這就是一個分組統(tǒng)計,顯然是多個輸入,一個輸出,這時候udf已經(jīng)不能滿足我們的需要,就需要寫udaf,user defined aggregare function
(用戶自定義聚合函數(shù))。
這里寫一個字符串連接函數(shù),相當于concat的功能,將多行輸入,合并為一個字符串:
用法,與udf一樣,還是需要打包并且到hive cli中注冊使用。
關于UDAF開發(fā)注意點:
-
需要import org.apache.hadoop.hive.ql.exec.UDAF以及org.apache.hadoop.hive.ql.exec.UDAFEvaluator,這兩個包都是必須的
-
函數(shù)類需要繼承UDAF類,內部類Evaluator實現(xiàn)UDAFEvaluator接口
-
Evaluator需要實現(xiàn) init、iterate、terminatePartial、merge、terminate這幾個函數(shù)
-
init函數(shù)類似于構造函數(shù),用于UDAF的初始化
-
iterate接收傳入的參數(shù),并進行內部的輪轉。其返回類型為boolean
-
terminatePartial無參數(shù),其為iterate函數(shù)輪轉結束后,返回亂轉數(shù)據(jù),iterate和terminatePartial類似于hadoop的Combiner
-
merge接收terminatePartial的返回結果,進行數(shù)據(jù)merge操作,其返回類型為boolean
-
terminate返回最終的聚集函數(shù)結果
-
作者:柯廣的網(wǎng)絡日志
微信公眾號:Java大數(shù)據(jù)與數(shù)據(jù)倉庫