這篇文章主要介紹了Spark Hive如何自定義函數(shù)應(yīng)用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián),為您提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)站營(yíng)銷(xiāo)推廣、網(wǎng)站開(kāi)發(fā)設(shè)計(jì),對(duì)服務(wù)成都人造霧等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗(yàn)。成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司成立于2013年,提供專(zhuān)業(yè)網(wǎng)站制作報(bào)價(jià)服務(wù),我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!
Spark目前支持UDF,UDTF,UDAF三種類(lèi)型的自定義函數(shù)。UDF使用場(chǎng)景:輸入一行,返回一個(gè)結(jié)果,一對(duì)一,比如定義一個(gè)函數(shù),功能是輸入一個(gè)IP地址,返回一個(gè)對(duì)應(yīng)的省份。UDTF使用場(chǎng)景: 輸入一行,返回多行(hive),一對(duì)多, 而sparkSQL中沒(méi)有UDTF, spark中用flatMap即可實(shí)現(xiàn)該功能。UDAF: 輸入多行,返回一行, aggregate(主要用于聚合功能,比如groupBy,count,sum), 這些是spark自帶的聚合函數(shù),但是復(fù)雜相對(duì)復(fù)雜。
Spark底層其實(shí)以CatalogFunction結(jié)構(gòu)封裝了一個(gè)函數(shù),其中FunctionIdentifier描述了函數(shù)名字等基本信息,F(xiàn)unctionResource描述了文件類(lèi)型(jar或者file)和文件路徑;Spark的SessionCatalog提供了函數(shù)注冊(cè),刪除,獲取等一些列接口,Spark的Executor在接收到函數(shù)執(zhí)行sql請(qǐng)求時(shí),通過(guò)緩存的CatalogFunction信息,找到CatalogFunction中對(duì)應(yīng)的jar地址以及ClassName, JVM動(dòng)態(tài)加載jar,并通過(guò)ClassName反射執(zhí)行對(duì)應(yīng)的函數(shù)。
?圖1. CatalogFunction結(jié)構(gòu)體
?圖2. 注冊(cè)加載函數(shù)邏輯
Hive的HiveSessionCatalog是繼承Spark的SessionCatalog,對(duì)Spark的基本功能做了一層裝飾以適配Hive的基本功能,其中包括函數(shù)功能。HiveSimpleUDF對(duì)應(yīng)UDF,HiveGenericUDF對(duì)應(yīng)GenericUDF,HiveUDAFFunction對(duì)應(yīng)AbstractGenericUDAFResolve以及UDAF,HiveGenericUDTF對(duì)應(yīng)GenericUDTF
圖3. Hive裝飾spark函數(shù)邏輯
UDF是最常用的函數(shù),使用起來(lái)相對(duì)比較簡(jiǎn)單,主要分為兩類(lèi)UDF:簡(jiǎn)單數(shù)據(jù)類(lèi)型,繼承UDF接口;復(fù)雜數(shù)據(jù)類(lèi)型,如Map,List,Struct等數(shù)據(jù)類(lèi)型,繼承GenericUDF接口。
簡(jiǎn)單類(lèi)型實(shí)現(xiàn)UDF時(shí),可自定義若干個(gè)名字evaluate為的方法,參數(shù)和返回類(lèi)型根據(jù)需要自己設(shè)置。因?yàn)閁DF接口默認(rèn)使用DefaultUDFMethodResolver去方法解析器獲取方法,解析器是根據(jù)用戶輸入?yún)?shù)和寫(xiě)死的名字evaluate去反射尋找方法元數(shù)據(jù)。當(dāng)然用戶也可以自定義解析器解析方法。
圖4. 自定義UDF簡(jiǎn)單示例
圖5.默認(rèn)UDF方法解析器
UDAF是聚合函數(shù),目前實(shí)現(xiàn)方式主要有三種:實(shí)現(xiàn)UDAF接口,比較老的簡(jiǎn)答實(shí)現(xiàn)方式,目前已經(jīng)被廢棄;實(shí)現(xiàn)UserDefinedAggregateFunction,目前使用比較普遍方式,按階段實(shí)現(xiàn)接口聚集數(shù)據(jù);實(shí)現(xiàn)AbstractGenericUDAFResolver,實(shí)現(xiàn)相對(duì)UserDefinedAggregateFunction方式稍微復(fù)雜點(diǎn),還需要實(shí)現(xiàn)一個(gè)計(jì)算器Evaluator(如通用計(jì)算器GenericUDAFEvaluator),UDAF的邏輯處理主要發(fā)生在Evaluator。
UserDefinedAggregateFunction定義輸入輸出數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)初始化緩沖區(qū)(initialize),聚合單條數(shù)據(jù)(update),聚合緩存區(qū)(merge)以及計(jì)算最終結(jié)果(evaluate)。
圖6.自定義UDAF簡(jiǎn)單示例
UDTF簡(jiǎn)單粗暴的理解是一行生成多行的自動(dòng)函數(shù),可以生成多行多列,又被稱為表生成函數(shù)。目前實(shí)現(xiàn)方式是實(shí)現(xiàn)GenericUDTF接口,實(shí)現(xiàn)2個(gè)接口,initialize接口參數(shù)校驗(yàn),列的定義,process接口接受一行數(shù)據(jù),切割數(shù)據(jù)。
圖7.自定義UDTF簡(jiǎn)單示例
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Spark Hive如何自定義函數(shù)應(yīng)用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
分享文章:SparkHive如何自定義函數(shù)應(yīng)用
文章路徑:http://chinadenli.net/article26/gjdecg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、建站公司、電子商務(wù)、App設(shè)計(jì)、軟件開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)