hadoopdatajoin有什么用

本篇內(nèi)容主要講解“hadoop datajoin有什么用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“hadoop datajoin有什么用”吧!

專業(yè)從事成都網(wǎng)站設(shè)計、做網(wǎng)站,高端網(wǎng)站制作設(shè)計,微信小程序,網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊竭力真誠服務(wù),采用H5場景定制+CSS3前端渲染技術(shù),成都響應(yīng)式網(wǎng)站建設(shè)公司,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項小組,與您實時在線互動,隨時提供解決方案,暢聊想法和感受。

hadoop datajoin 之reduce side join

hadoop提供了一個叫datajoin的jar包,用于解決兩張表關(guān)聯(lián)的問題。jar位于/hadoop/contrib/datajoin將jar包引入進(jìn)行開發(fā)。

涉及的幾個概念:

1.Data Source:基本與關(guān)系數(shù)據(jù)庫中的表相似,形式為:(例子中為CSV格式)

Customers                  Orders
    1,Stephanie Leung,555-555-5555      3,A,12.95,02-Jun-2008
    2,Edward Kim,123-456-7890         1,B,88.25,20-May-2008
    3,Jose Madriz,281-330-8004         2,C,32.00,30-Nov-2007
    4,David Stork,408-555-0000          3,D,25.02,22-Jan-2009

2.Tag:由于記錄類型(Customers或Orders)與記錄本身分離,標(biāo)記一個Record會確保特殊元數(shù)據(jù)會一致存在于記錄中。在這個目的下,我們將使用每個record自身的Data source名稱標(biāo)記每個record。

3.Group Key:Group Key類似于關(guān)系數(shù)據(jù)庫中的鏈接鍵(join key),在我們的例子中,group key就是Customer ID(第一列的3)。由于datajoin包允許用戶自定義group key,所以其較之關(guān)系數(shù)據(jù)庫中的join key更一般、平常。

使用以下樣例數(shù)據(jù)

customers-20140716

1,Stephanie Leung,555-555-5555
2,Edward Kim,123-456-7890
3,Jose Madriz,281-330-8004
4,David Stork,408-555-0000

orders-20140716

3,A,12.95,02-Jun-2008
1,B,88.25,20-May-2008
2,C,32.00,30-Nov-2007
3,D,25.02,22-Jan-2009
請看流程圖

hadoop datajoin有什么用

第一部分,自定義的數(shù)據(jù)類型。數(shù)據(jù)類型主要包含兩部分tag和data,tag是給數(shù)據(jù)打上的標(biāo)簽用來表示數(shù)據(jù)來源于哪個文件。data是數(shù)據(jù)記錄。

上代碼:

public class TaggedWritable extends TaggedMapOutput {
    private Text data;
    
    public TaggedWritable() {
        this.tag = new Text("");
        this.data = new Text("");
    }
    
    public TaggedWritable(Text data) {
        this.data = data;
    }
    @Override
    public void readFields(DataInput in) throws IOException {
        this.tag.readFields(in);
        this.data.readFields(in);
    }
    @Override
    public void write(DataOutput out) throws IOException {
        this.tag.write(out);
        this.data.write(out);
    }
    @Override
    public Text getData() {
        return data;
    }
}

第二部分,map函數(shù)

public class Mapclass extends DataJoinMapperBase{
    @Override
    protected Text generateGroupKey(TaggedMapOutput aRecord) {
        String line = aRecord.getData().toString();
        String[] tokens = line.split(",");
        String groupKey = tokens[0];
        return new Text(groupKey);
    }
    @Override
    protected Text generateInputTag(String inputFile) {
        String datasource = inputFile.split("-")[0];
        return new Text(datasource);
    }
    @Override
    protected TaggedWritable generateTaggedMapOutput(Object value) {
        TaggedWritable retv = new TaggedWritable(new Text(value.toString()));
        retv.setTag(this.inputTag);
        return retv;
    }
}

map函數(shù)中要特別注意protected TaggedWritable generateTaggedMapOutput(Object value) 該方法的返回類型為你第一步定義的類型。

第三部分,reduce

public class Reduce extends DataJoinReducerBase{
    @Override
    protected TaggedMapOutput combine(Object[] tags, Object[] values) {
        if (tags.length < 2) {
            return null;    
        }
        
        String joinedStr = "";   
        for (int i=0; i<values.length; i++) {  
            if (i > 0){
                joinedStr += ","; 
            }
            TaggedWritable tw = (TaggedWritable) values[i];  
            String line = tw.getData().toString();  
            System.out.println("line=========:"+line);
            String[] tokens = line.split(",", 2);  
            joinedStr += tokens[1];  
        }  
        TaggedWritable retv = new TaggedWritable(new Text(joinedStr));  
        retv.setTag((Text) tags[0]);   
        return retv;  
    }
}

reduce過程會將主鍵與數(shù)據(jù)組合在一起輸出,你拼接的字符串中無需寫入主鍵。

public class Datajoin extends Configured implements Tool {
    @Override
    public int run(String[] args) throws Exception {
        Configuration conf = this.getConf();
        JobConf job = new JobConf(conf, Datajoin.class);
        job.setJarByClass(Datajoin.class);
        Path in = new Path("hdfs://172.16.0.87:9000/user/jeff/datajoin/");
        Path out = new Path("hdfs://172.16.0.87:9000/user/jeff/datajoin/out");
        FileInputFormat.setInputPaths(job, in);
        FileOutputFormat.setOutputPath(job, out);
        job.setJobName("DataJoin");
        
        job.setMapperClass(Mapclass.class);
        job.setReducerClass(Reduce.class);
        
        job.setInputFormat(TextInputFormat.class);
        job.setOutputFormat(TextOutputFormat.class);
        
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(TaggedWritable.class);
        
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        job.set("mapred.textoutputformat.separator", ",");
        JobClient.runJob(job);
        return 0;
    }
    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new Datajoin(), args);
        System.exit(res);
    }
}

運(yùn)行mapreduce任務(wù)后的輸出為:

1,Stephanie Leung,555-555-5555,B,88.25,20-May-2008
2,Edward Kim,123-456-7890,C,32.00,30-Nov-2007
3,Jose Madriz,281-330-8004,A,12.95,02-Jun-2008
3,Jose Madriz,281-330-8004,D,25.02,22-Jan-2009

可以在reduce的combin函數(shù)中控制函數(shù)的輸出形式,左聯(lián),或者右聯(lián)。

到此,相信大家對“hadoop datajoin有什么用”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章標(biāo)題:hadoopdatajoin有什么用
網(wǎng)站網(wǎng)址:http://muchs.cn/article20/gjsjco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣企業(yè)建站、網(wǎng)站設(shè)計公司關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計公司域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名