Hive的UDF概念
首先我們學(xué)習(xí)hadoop的時(shí)候,為了讓我們不太會(huì)java語言但是對(duì)SQL很熟悉的工程師能夠操作基本的mapreduce計(jì)算過程,Hive被設(shè)計(jì)出來了。Hive就好比是hadoop在執(zhí)行MR(mapreduce)程序的一個(gè)操作系統(tǒng),因?yàn)槲覀兛梢杂煤?jiǎn)單的SQL語句去代替復(fù)雜的MR程序,因?yàn)镠ive可以將我們的SQL語句轉(zhuǎn)化為MR程序然后去執(zhí)行。Hive的語法和SQL的語法很多地方是相同的,所以說它就是為熟連使用SQL的工程師設(shè)計(jì)的。
首先什么是UDF,UDF的全稱為user-defined function,用戶定義函數(shù),為什么有它的存在呢?有的時(shí)候 你要寫的查詢無法輕松地使用Hive提供的內(nèi)置函數(shù)來表示,通過寫UDF,Hive就可以方便地插入用戶寫的處理代碼并在查詢中使用它們,相當(dāng)于在HQL(Hive SQL)中自定義一些函數(shù)。
首先UDF必須用java語言編寫,Hive本身就是用java寫的。所以想學(xué)好hadoop這個(gè)分布式框架的相關(guān)技術(shù),熟練使用java就是基本功了!
Hive中有三種UDF:(普通)UDF、用戶定義聚集函數(shù)(user-defined aggregate function,UDAF)、用戶定義表生成函數(shù)(user-defined table-generating function,UDTF)。
UDF操作作用于單個(gè)數(shù)據(jù)行,并且產(chǎn)生一個(gè)數(shù)據(jù)行作為輸出。大多數(shù)函數(shù)都屬于這一類(比如數(shù)學(xué)函數(shù)和字符串函數(shù))。
UDAF 接受多個(gè)輸入數(shù)據(jù)行,并產(chǎn)生一個(gè)輸出數(shù)據(jù)行。想COUNT和MAX這樣的函數(shù)就是聚集函數(shù)。
UDTF 操作作用于單個(gè)數(shù)據(jù)行,并且產(chǎn)生多個(gè)數(shù)據(jù)行-------一個(gè)表作為輸出
首先一個(gè)UDF必須滿足下面兩個(gè)條件:
1 一個(gè)UDF必須是org.apache.hadoop.hive.ql.exec.UDF的子類(換句話說就是我們一般都是去繼承這個(gè)類)
2 一個(gè)UDF必須至少實(shí)現(xiàn)了evaluate()方法
注意UDF名不是大小寫敏感的
一個(gè)UDAF計(jì)算函數(shù)必須實(shí)現(xiàn)下面的5個(gè)方法:
1 init()方法 init()方法負(fù)責(zé)初始化計(jì)算函數(shù)并重設(shè)它的內(nèi)部狀態(tài)。在MaximumIntUDAFEvaluator中,我們把存放最終結(jié)果的IntWritable對(duì)象設(shè)置為null。我們使用null來表示目前還沒有對(duì)任何值進(jìn)行聚集計(jì)算,這和對(duì)空集NULL計(jì)算最大值應(yīng)有的結(jié)果是一致的。
2 iterate()方法 每次對(duì)一個(gè)新值進(jìn)行聚集計(jì)算時(shí)都會(huì)調(diào)用iterate()方法。計(jì)算函數(shù)要根據(jù)聚集計(jì)算的結(jié)果更新其內(nèi)部狀態(tài)。iterate()接受的參數(shù)和Hive中被調(diào)用函數(shù)的參數(shù)使對(duì)應(yīng)的。
3 terminatePartial()方法 Hive需要部分聚集結(jié)果時(shí)會(huì)調(diào)用terminatePartial()方法。這個(gè)方法必須返回一個(gè)封裝了聚集計(jì)算當(dāng)前狀態(tài)的對(duì)象。
4 merge()方法 在Hive決定要合并一個(gè)部分聚集值和另一個(gè)部分聚集值時(shí)會(huì)調(diào)用merge()方法。該方法接受一個(gè)對(duì)象作為輸入。這個(gè)對(duì)象的類型必須和terminatePartial()方法返回的類型一致。
5 terminate() Hive需要最終聚集結(jié)果時(shí)會(huì)調(diào)用terminate()方法。計(jì)算函數(shù)需要把狀態(tài)作為一個(gè)值返回。
具體去寫UDF的過程我這里就不具體說了,我來說說,怎樣去把我們寫好的UDF放到Hive中去使用:
首先我們將用java寫好的UDF函數(shù)編譯后的Java類打包成為一個(gè)JAR文件,并在Hive中注冊(cè)這個(gè)文件(相當(dāng)于告訴Hive這個(gè)是我寫的UDF):
轉(zhuǎn)載”https://blog.csdn.net/yqlakers/article/details/70211522
總結(jié)
以上是生活随笔為你收集整理的Hive的UDF概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【待解答】文件目录可以利用foreach
- 下一篇: 【转载保存】java牛逼的开源项目汇总