Hadoop數(shù)據(jù)分析平臺實(shí)戰(zhàn)——140Hive函數(shù)以及自定義函數(shù)講解

離線數(shù)據(jù)分析平臺實(shí)戰(zhàn)——140Hive函數(shù)以及自定義函數(shù)講解

Hive函數(shù)介紹

HQL內(nèi)嵌函數(shù)只有195個函數(shù)(包括操作符,使用命令show functions查看)幼驶,基本能夠勝任基本的hive開發(fā)爸邢,但是當(dāng)有較為復(fù)雜的需求的時候怔檩,可能需要進(jìn)行定制的HQL函數(shù)開發(fā)鼓择。
HQL支持三種方式來進(jìn)行功能的擴(kuò)展(只支持使用java編寫實(shí)現(xiàn)自定義函數(shù))兑宇,分別是:UDF(User-Defined Function)启上、UDAF(User-Defined Aggregate Function)和UDTF(User-Defined Table-Generating Function)邢隧。
當(dāng)我們使用java語言進(jìn)行開發(fā)完成后,將生成的jar包移到linux機(jī)器(hive機(jī)器)上,進(jìn)行函數(shù)的創(chuàng)建冈在,然后進(jìn)行使用即可倒慧。

函數(shù)創(chuàng)建命令

HQL函數(shù)的創(chuàng)建一般分為以下幾步:

  1. 添加jar(0.13.*不支持hdfs上的jar添加,14版本才開始支持)
    add jar linux_jar_path
  2. 創(chuàng)建function包券,語法規(guī)則如下:
    create [temporary] function [dbname.]function_name AS class_name;
  3. 使用function纫谅,和使用其他函數(shù)一樣。

函數(shù)刪除命令

我們可以通過drop命令刪除自定義函數(shù)溅固,語法規(guī)則如下:
drop [temporary] function [if exists] [dbname.]function_name;

自定義UDF介紹

UDF(User-Defined Function)支持一個輸入產(chǎn)生一個輸出系宜,是一個最常用的自定義函數(shù)類型。
實(shí)現(xiàn)自定義UDF要求繼承類org.apache.hadoop.hive.ql.exec.UDF发魄,并且在自定義UDF類中重載實(shí)現(xiàn)evaluate方法盹牧,我們可以通過重載多個evaluate方法達(dá)到函數(shù)參數(shù)多樣化的需求。
實(shí)現(xiàn)案例:
實(shí)現(xiàn)一個大小寫轉(zhuǎn)換的函數(shù)励幼,要求函數(shù)通過參數(shù)的不同決定是進(jìn)行那種轉(zhuǎn)換汰寓,默認(rèn)是轉(zhuǎn)換為小寫。

UDAF介紹

UDAF(User-Defined Aggregate Function)支持多個輸入苹粟,一個輸出有滑。
在原來的版本中可以通過繼承UDAF類來實(shí)現(xiàn)自定義UDAF,但是現(xiàn)在hive已經(jīng)將這個類標(biāo)注為棄用狀態(tài)嵌削。
現(xiàn)在一般通過繼承AbstractGenericUDAFResolver類來實(shí)現(xiàn)自定義UDAF毛好,通過這種方式要求實(shí)現(xiàn)自定義的GenericUDAFEvaluator。
也就是說在現(xiàn)在的hive版本中苛秕,實(shí)現(xiàn)自定義UDAF肌访,那么需要實(shí)現(xiàn)兩個類,分別是AbstractGenericUDAFResolver和GenericUDAFEvaluator艇劫。

AbstractGenericUDAFResolver介紹

AbstractGenericUDAFResolver類主要作用就是根據(jù)hql調(diào)用時候的函數(shù)參數(shù)來獲取具體的GenericUDAFEvaluator實(shí)例對象吼驶,也就是說實(shí)現(xiàn)方法getEvaluator即可,該方法的主要作用就是根據(jù)參數(shù)的不同返回不同的evaluator實(shí)例對象,實(shí)現(xiàn)多態(tài)性。

GenericUDAFEvaluator介紹

GenericUDAFEvaluator類主要作用就是根據(jù)job的不同階段執(zhí)行不同的方法蟹演。
hive通過GenericUDAFEvaluator.Model來確定job的執(zhí)行階段风钻。
PARTIAL1:從原始數(shù)據(jù)到部分聚合,會調(diào)用方法iterate和terminatePartial方法酒请;
PARTIAL2:從部分?jǐn)?shù)據(jù)聚合和部分?jǐn)?shù)據(jù)聚合骡技,會調(diào)用方法merge和terminatePartial;
FINAL:從部分?jǐn)?shù)據(jù)聚合到全部數(shù)據(jù)聚合羞反,會調(diào)用方法merge和terminate布朦;
COMPLETE:從原始數(shù)據(jù)到全部數(shù)據(jù)聚合,會調(diào)用方法iterate和terminate苟弛。
除了上面提到的iterate喝滞、merge阁将、terminate和terminatePartial以外膏秫,還有init(初始化并返回返回值的類型)、getNewAggregationBuffer(獲取新的buffer對象做盅,也就是方法之間傳遞參數(shù)的對象)缤削,reset(重置buffer對象)。

UDAF案例

實(shí)現(xiàn)一個自定義的sum函數(shù)吹榴。要求函數(shù)支持整形和浮點(diǎn)型的sum操作亭敢。

UDTF介紹

UDTF(User-Defined Table-Generating Function)支持一個輸入多個輸出。
一般用于解析工作图筹,比如說解析url帅刀,然后獲取url中的信息。要求繼承類org.apache.hadoop.hive.ql.udf.generic.GenericUDTF远剩,
實(shí)現(xiàn)方法:
initialize(返回返回值的參數(shù)類型)扣溺、process具體的處理方法,一般在這個方法中會調(diào)用父類的forward方法進(jìn)行數(shù)據(jù)的寫出瓜晤、close關(guān)閉資源方法锥余,最終會調(diào)用close方法,同MR程序中的cleanUp方法痢掠。

實(shí)現(xiàn)功能:解析爬蟲數(shù)據(jù)驱犹,從數(shù)據(jù)中讀取產(chǎn)品id、產(chǎn)品名稱足画、價格雄驹。

常用的三種集成自定義函數(shù)的方式

首先要求創(chuàng)建的function是永久function,不能是臨時function淹辞。

第一種:修改hive-site.xml文件荠医,添加參數(shù)hive.aux.jars.path,value為jar包的linux本地路徑,要求是以file:///開頭的絕對路徑彬向。
第二種:直接將jar包移動到hive的lib文件夾中兼贡。
第三種:將jar包移動到hdfs上,然后在創(chuàng)建function的時候指定function使用的hdfs上的jar文件絕對路徑(包括hdfs://hh:8020/前綴)娃胆,這樣在使用的時候遍希,hive會自動將jar下載到本地進(jìn)行緩存的。

另外一種hive集成自定義函數(shù)的方式

我們可以通過修改hive的源碼里烦,進(jìn)行自定義函數(shù)的添加凿蒜,添加完成后,我們就不需要再手動創(chuàng)建函數(shù)胁黑。添加步驟如下:

  1. 假設(shè)自定義函數(shù)的整個包名為com.beifeng.ql.udf.UDFTest, jar文件為beifengUserUDF.jar废封。將該jar包移動到hive的lib文件夾中。
  2. 修改hive源文件$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java丧蘸,添加import com.beifeng.ql.udf.UDFTest; registerUDF("test", UDFTest.class,false);
  3. 編譯hive后漂洋,進(jìn)行jar包的替換,然后就可以使用函數(shù)了力喷。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刽漂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子弟孟,更是在濱河造成了極大的恐慌贝咙,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拂募,死亡現(xiàn)場離奇詭異庭猩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陈症,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蔼水,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爬凑,你說我怎么就攤上這事徙缴。” “怎么了嘁信?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵于样,是天一觀的道長。 經(jīng)常有香客問我潘靖,道長穿剖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任卦溢,我火速辦了婚禮糊余,結(jié)果婚禮上秀又,老公的妹妹穿的比我還像新娘。我一直安慰自己贬芥,他們只是感情好吐辙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蘸劈,像睡著了一般昏苏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上威沫,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天贤惯,我揣著相機(jī)與錄音,去河邊找鬼棒掠。 笑死孵构,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烟很。 我是一名探鬼主播颈墅,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溯职!你這毒婦竟也來了精盅?” 一聲冷哼從身側(cè)響起帽哑,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤谜酒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妻枕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僻族,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年屡谐,在試婚紗的時候發(fā)現(xiàn)自己被綠了述么。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡愕掏,死狀恐怖度秘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饵撑,我是刑警寧澤剑梳,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站滑潘,受9級特大地震影響垢乙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜语卤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一追逮、第九天 我趴在偏房一處隱蔽的房頂上張望酪刀。 院中可真熱鬧,春花似錦钮孵、人聲如沸骂倘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稠茂。三九已至,卻和暖如春情妖,著一層夾襖步出監(jiān)牢的瞬間睬关,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工毡证, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留电爹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓料睛,卻偏偏與公主長得像丐箩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恤煞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • hive簡介 解釋一:Hive是一個數(shù)據(jù)倉庫基礎(chǔ)工具在Hadoop中用來處理結(jié)構(gòu)化數(shù)據(jù)屎勘。它架構(gòu)在Hadoop之上,...
    卡卡xx閱讀 6,319評論 0 4
  • Hive進(jìn)行UDF開發(fā)十分簡單居扒,此處所說UDF為Temporary的function概漱,所以需要hive版本在0.4...
    本寶寶天然萌閱讀 2,445評論 0 4
  • Hive函數(shù) - 簡書 http://www.reibang.com/p/bed0bf1f9a0b cli命令顯...
    葡萄喃喃囈語閱讀 1,018評論 0 2
  • Hive函數(shù) 函數(shù)分類 cli命令顯示當(dāng)前對話有多少函數(shù)可用 show functions;顯示函數(shù)的表述信息 ...
    發(fā)條香蕉閱讀 1,560評論 0 5
  • 大森林里,有很多動物喜喂,這些動物當(dāng)中瓤摧,大體上分為三大類;一類是像獅子玉吁、老虎照弥,他們喜歡獨(dú)來獨(dú)往,更重要的是进副,他...
    皇城根下拾豆莢閱讀 804評論 0 1