日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
UDF和UDAF開發(fā)方法是什么

這篇文章主要講解了“UDF和UDAF開發(fā)方法是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“UDF和UDAF開發(fā)方法是什么”吧!

成都服務器托管,創(chuàng)新互聯(lián)提供包括服務器租用、服務器托管、帶寬租用、云主機、機柜租用、主機租用托管、CDN網(wǎng)站加速、申請域名等業(yè)務的一體化完整服務。電話咨詢:18980820575

UDF自定義函數(shù)

自定義函數(shù)包括三種UDF、UDAF、UDTF

UDF(User-Defined-Function) 一進一出

UDAF(User- Defined Aggregation Funcation) 聚集函數(shù),多進一出。Count/max/min

UDTF(User-Defined Table-Generating Functions)  一進多出,如lateral view explore()

使用方式 :在HIVE會話中add 自定義函數(shù)的jar文件,然后創(chuàng)建function繼而使用函數(shù)

使用方式 :

在HIVE會話中add 自定義函數(shù)的jar文件,然后創(chuàng)建function,繼而使用函數(shù)

UDF開發(fā)

1、UDF函數(shù)可以直接應用于select語句,對查詢結(jié)構(gòu)做格式化處理后,再輸出內(nèi)容。

2、編寫UDF函數(shù)的時候需要注意一下幾點:

a)自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF。

b)需要實現(xiàn)evaluate函數(shù),evaluate函數(shù)支持重載。

3、步驟

a)把程序打包放到目標機器上去;

b)進入hive客戶端,添加jar包:hive>add jar /run/jar/udf_test.jar;

c)創(chuàng)建臨時函數(shù):hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';

d)查詢HQL語句:

    SELECT add_example(8, 9) FROM scores;

    SELECT add_example(scores.math, scores.art) FROM scores;

    SELECT add_example(6, 7, 8, 6.8) FROM scores;

e)銷毀臨時函數(shù):hive> DROP TEMPORARY FUNCTION add_example;

注:UDF只能實現(xiàn)一進一出的操作,如果需要實現(xiàn)多進一出,則需要實現(xiàn)UDAF

udf實現(xiàn)對字符串的截取

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ù)

多行進一行出,如sum()、min(),用在group  by時

1.必須繼承

}         org.apache.hadoop.hive.ql.exec.UDAF(函數(shù)類繼承)

}         org.apache.hadoop.hive.ql.exec.UDAFEvaluator(內(nèi)部類Evaluator實現(xiàn)UDAFEvaluator接口)

2.Evaluator需要實現(xiàn) init、iterate、terminatePartial、merge、terminate這幾個函數(shù)

}         init():類似于構(gòu)造函數(shù),用于UDAF的初始化

}         iterate():接收傳入的參數(shù),并進行內(nèi)部的輪轉(zhuǎn),返回boolean

}         terminatePartial():無參數(shù),其為iterate函數(shù)輪轉(zhuǎn)結(jié)束后,返回輪轉(zhuǎn)數(shù)據(jù),                                 類似于hadoop的Combiner

}         merge():接收terminatePartial的返回結(jié)果,進行數(shù)據(jù)merge操作,其返回類型為boolean

}         terminate():返回最終的聚集函數(shù)結(jié)果

}開發(fā)一個功能同:

}Oracle的wm_concat()函數(shù)

}MySQL的group_concat()

UDF和UDAF開發(fā)方法是什么

package hive;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
public class Wm_concat {
    public static class myUDAFEval implements UDAFEvaluator{
        private PartialResult partial = new PartialResult();
        public static  class PartialResult{
            String result = "";
            String delimiter = null;
            
        }
        @Override
        public void init() {
            partial.result ="";
        }
        public boolean iterate(String value ,String deli){
            if(value == null || "null".equalsIgnoreCase(value)){
                return true;
            }
            if(partial.delimiter == null){
                partial.delimiter = deli;
            }
            if(partial.result.length()>0){
                partial.result = partial.result.concat(partial.delimiter);//拼接
            } 
            partial.result = partial.result.concat(value);//拼接
            return true;
        }
        public PartialResult terminatePartial(){
            return partial;
        }
        
        public boolean merge(PartialResult other){
            if(other == null ){
                return true;
            }
            if (partial.delimiter == null) {
                partial.delimiter = other.result;
                partial.result = other.result;
            }else{
                if (partial.result.length()>0) {
                    partial.result = partial.result.concat(partial.delimiter);
                }
                partial.result = partial.result.concat(other.result);
            }
            return true;
        }
        public String terminate(){
            if(partial==null || partial.result.length()==0){
                return null;
            }
            return partial.result;
        }
        
    }
}

測試:

create table test(id string , name string ) row format delimited fields terminated by '\t';

插入數(shù)據(jù)

1       a

1       b

2       b

3       c

1       c

2       a

4       b

2       d

1       d

4       c

3       b

在hive中執(zhí)行函數(shù)如下

select id,concat(name,',') from wm_concat where id is not null group by id;

UDF和UDAF開發(fā)方法是什么

感謝各位的閱讀,以上就是“UDF和UDAF開發(fā)方法是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對UDF和UDAF開發(fā)方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!


文章名稱:UDF和UDAF開發(fā)方法是什么
新聞來源:http://www.dlmjj.cn/article/pegses.html