欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

MR案例:Reduce-Join

发布时间:2025/4/9 编程问答 31 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MR案例:Reduce-Join 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

问题描述:两种类型输入文件:address(地址)和company(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD、Beijing Red Star)的关联信息。可参考MR案例:Map-Join

1.map阶段:对比之前的单表关联可知,reduce阶段的key必须为关联两表的key,即address.Id = company.Id。则两表经过map处理输出的key必须是Id。

Class Map<LongWritable, Text, LongWritable, Text>{method map(){// 获取文件的每一行数据,并以":"分割String[] line = value.toString().split(":");//split对应的文件名String fileName = ((FileSplit) context.getInputSplit()).getPath().getName();//处理company文件的value信息:"Beijing Red Star:1"if (path.indexOf("company") >= 0){//<key,value> --<"1","company:Beijing Red Star">context.write(new LongWritable(line[1]), new Text("company" + ":" + line[0]));}//处理adress文件的value信息:"1:Beijing"else if (path.indexOf("address") >= 0){//<key,value> --<"1","address:Beijing">context.write(new LongWritable(line[0]), new Text("address" + ":" + line[1]));}} }

2.reduce阶段:首先对输入<key, values>即<”1”,[“company:Beijing Red Star”,”company:Beijing JD”,”address:Beijing”]>的values值进行遍历获取到单元信息value(例如”company:Beijing Red Star”),然后根据value中的标识符(company和address)将公司名和地址名分别存入到company集合和address集合,最后对company集合和address集合进行笛卡尔积运算得到company与address的关系,并进行输出。

Class Reducer<LongWritable, Text, Text, Text>{method reduce(){//用来存储 company 和 address 的集合List<String> companys = new ArrayList<String>();List<String> addresses = new ArrayList<String>();for(Text text : v2s){ String[] result = text.toString().split(":");//以 company 开头的value存储到 company 集合中if(result[0].equals("company")){companys.add(result[1]);}//以 address 开头的value存储到 address 集合中else if(result[0].equals("address")){addresses.add(result[1]);}}
/**
* 如果只判断左表addresses.size()!=0;则转化为 左外连接 --> LEFT OUTER JOIN
* 如果只判断右表companys.size()!=0;则转化为 右外连接 --> RIGHT OUTER JOIN
* 左右都不判断,则转化为 全外连接 --> FULL OUTER JOIN

*/
// 求笛卡尔积if(0 != companys.size()&& 0 != addresses.size()){for(int i=0;i<companys.size();i++){for(int j=0;j<addresses.size();j++){//<key,value>--<"Beijing JD","Beijing">context.write(new Text(companys.get(i)), new Text(addresses.get(j)));}}}} }
 

转载于:https://www.cnblogs.com/skyl/p/4746005.html

总结

以上是生活随笔为你收集整理的MR案例:Reduce-Join的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。