本篇內(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
請看流程圖
第一部分,自定義的數(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)