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