這篇文章主要為大家展示了“hive如何自定義函數(shù)”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“hive如何自定義函數(shù)”這篇文章吧。
成都創(chuàng)新互聯(lián)秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè),重慶小程序開發(fā),網(wǎng)頁設(shè)計(jì)制作,手機(jī)網(wǎng)站開發(fā),全網(wǎng)營銷推廣幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級(jí)專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對(duì)客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長。
自定義函數(shù)包括三種UDF、UDAF、UDTF
UDF(User-Defined-Function) 一進(jìn)一出
UDAF(User- Defined Aggregation Funcation) 聚集函數(shù),多進(jìn)一出。Count/max/min
UDTF(User-Defined Table-Generating Functions) 一進(jìn)多出,如lateral view explore()
使用方式 :在HIVE會(huì)話中add 自定義函數(shù)的jar文件,然后創(chuàng)建function繼而使用函數(shù)
UDF
這是普通的用戶自定義函數(shù)。接受單行輸入,并產(chǎn)生單行輸出。
1、UDF函數(shù)可以直接應(yīng)用于select語句,對(duì)查詢結(jié)構(gòu)做格式化處理后,再輸出內(nèi)容。
2、編寫UDF函數(shù)的時(shí)候需要注意一下幾點(diǎn):
a)自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF。
b)需要實(shí)現(xiàn)evaluate函數(shù),evaluate函數(shù)支持重載。
注:UDF只能實(shí)現(xiàn)一進(jìn)一出的操作,如果需要實(shí)現(xiàn)多進(jìn)一出,則需要實(shí)現(xiàn)UDAF
udf實(shí)現(xiàn)對(duì)字符串的截取
package hive; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.hadoop.hive.ql.exec.UDF; public class GetCmsID extends UDF{ public String evaluate(String url){ String cmsid = null; if(url ==null || "".equals(url)){ return cmsid; } Pattern pat = Pattern.compile("topicId=[0-9]+"); Matcher matcher = pat.matcher(url); if(matcher.find() ){ cmsid=matcher.group().split("topicId=")[1]; } return cmsid; } public String evaluate(String pattern,String url ){ String cmsid = null; if(url ==null || "".equals(url)){ return cmsid; } Pattern pat = Pattern.compile(pattern+"[0-9]+"); Matcher matcher = pat.matcher(url); if(matcher.find() ){ cmsid=matcher.group().split(pattern)[1]; } return cmsid; } public static void main(String[] args) { String url = "http://www.baidu.com/cms/view.do?topicId=123456"; GetCmsID getCmsID = new GetCmsID(); System.out.println(getCmsID.evaluate(url)); System.out.println(getCmsID.evaluate("topicId=",url)); } }
UDAF
用戶定義聚集函數(shù)(User-defined aggregate function)。接受多行輸入,并產(chǎn)生單行輸出。比如MAX,COUNT函數(shù)。
1.必須繼承
org.apache.hadoop.hive.ql.exec.UDAF(函數(shù)類繼承)
org.apache.hadoop.hive.ql.exec.UDAFEvaluator(內(nèi)部類Evaluator實(shí)現(xiàn)UDAFEvaluator接口)
2.Evaluator需要實(shí)現(xiàn) init、iterate、terminatePartial、merge、terminate這幾個(gè)函數(shù)
init():類似于構(gòu)造函數(shù),用于UDAF的初始化
iterate():接收傳入的參數(shù),用于聚合。當(dāng)每一個(gè)新的值被聚合時(shí),此函數(shù)被調(diào)用,返回boolean
terminatePartial():無參數(shù),函數(shù)在部分聚合完成后被調(diào)用。當(dāng)hive希望得到部分記錄的聚合結(jié)果時(shí),此函數(shù)被調(diào)用。
merge():接收terminatePartial的返回結(jié)果,用于合并先前得到的部分聚合結(jié)果(也可以理解為分塊記錄的聚合結(jié)果),其返回類型為boolean
terminate():返回最終的聚集函數(shù)結(jié)果
merge的輸入?yún)?shù)類型和terminatePartial函數(shù)的返回值類型必須是一致的。
packagecom.oserp.hiveudf; importorg.apache.hadoop.hive.ql.exec.UDAF; importorg.apache.hadoop.hive.ql.exec.UDAFEvaluator; importorg.apache.hadoop.hive.serde2.io.DoubleWritable; importorg.apache.hadoop.io.IntWritable; public class HiveAvg extends UDAF { public static class AvgEvaluate implements UDAFEvaluator { public static class PartialResult { public intcount; public doubletotal; public PartialResult() { count = 0; total = 0; } } private PartialResult partialResult; @Override public void init() { partialResult = new PartialResult(); } public boolean iterate(IntWritable value) { // 此處一定要判斷partialResult是否為空,否則會(huì)報(bào)錯(cuò) // 原因就是init函數(shù)只會(huì)被調(diào)用一遍,不會(huì)為每個(gè)部分聚集操作去做初始化 //此處如果不加判斷就會(huì)出錯(cuò) if (partialResult==null) { partialResult =new PartialResult(); } if (value !=null) { partialResult.total =partialResult.total +value.get(); partialResult.count=partialResult.count + 1; } return true; } public PartialResult terminatePartial() { returnpartialResult; } public boolean merge(PartialResult other) { partialResult.total=partialResult.total + other.total; partialResult.count=partialResult.count + other.count; return true; } public DoubleWritable terminate() { return newDoubleWritable(partialResult.total /partialResult.count); } } }
部署運(yùn)行
1).把程序打包放到目標(biāo)機(jī)器上去
2).進(jìn)入hive客戶端,添加jar包:
hive> add jar /home/sfd/udf_test.jar
3).創(chuàng)建臨時(shí)函數(shù):
hive> create temporary function <函數(shù)名>
> as 'java全類名';
4).銷毀臨時(shí)函數(shù):
hive> drop temporary function <函數(shù)名>;
以上是“hive如何自定義函數(shù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文標(biāo)題:hive如何自定義函數(shù)
網(wǎng)站地址:http://chinadenli.net/article14/pehhde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站維護(hù)、全網(wǎng)營銷推廣、網(wǎng)站營銷、ChatGPT、動(dòng)態(tài)網(wǎng)站
聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)