MapReduce实现寻找共同好友
来源:互联网 发布:警服照试穿软件 编辑:程序博客网 时间:2024/06/12 19:18
1.需求
给出A-O个人中每个人的好友列表,求出哪些人两两之间有共同好友,以及他们的共同好友都有谁
原始文件:
A:B,C,D,F,E,OB:A,C,E,KC:F,A,D,ID:A,E,F,LE:B,C,D,M,LF:A,B,C,D,E,O,MG:A,C,D,E,FH:A,C,D,E,OI:A,OJ:B,OK:A,C,DL:D,E,FM:E,F,GO:A,H,I,J输出格式:
A-B:C,E...
2.思路
此题旨在求两人之间的共同好友,原信息是<人,该人的所有好友>,因此首先以好友为键,人为值,交给reduce找出拥有此好友的所有人;再将这些人中两两配对作为键,之前的键(好友)作为值交给reduce去合并
简而言之我打算分成两个步骤,两次迭代
1)求出每一个人都是哪些人的共同好友
2)把这些人(用共同好友的人)作为key,其好友作为value输出
3.代码
public class SharedFriend {/* 第一阶段的map函数主要完成以下任务 1.遍历原始文件中每行<所有朋友>信息 2.遍历“朋友”集合,以每个“朋友”为键,原来的“人”为值 即输出<朋友,人> */static class SharedFriendMapper01 extends Mapper<LongWritable, Text, Text, Text>{@Overrideprotected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {String line = value.toString();String[] person_friends = line.split(":");String person = person_friends[0];String[] friends = person_friends[1].split(",");for(String friend : friends){context.write(new Text(friend), new Text(person));}}}/* 第一阶段的reduce函数主要完成以下任务 1.对所有传过来的<朋友,list(人)>进行拼接,输出<朋友,拥有这名朋友的所有人> */static class SharedFriendReducer01 extends Reducer<Text, Text, Text, Text>{@Overrideprotected void reduce(Text key, Iterable<Text> values,Context context)throws IOException, InterruptedException {StringBuffer sb = new StringBuffer();for(Text friend : values){sb.append(friend.toString()).append(",");}sb.deleteCharAt(sb.length()-1);context.write(key, new Text(sb.toString()));}}/*第二阶段的map函数主要完成以下任务1.将上一阶段reduce输出的<朋友,拥有这名朋友的所有人>信息中的 “拥有这名朋友的所有人”进行排序 ,以防出现B-C C-B这样的重复2.将 “拥有这名朋友的所有人”进行两两配对,并将配对后的字符串当做键,“朋友”当做值输出,即输出<人-人,共同朋友> */static class SharedFriendMapper02 extends Mapper<LongWritable, Text, Text, Text>{@Overrideprotected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {String line = value.toString();String[] friend_persons = line.split("\t");String friend = friend_persons[0];String[] persons = friend_persons[1].split(",");Arrays.sort(persons); //排序//两两配对for(int i=0;i<persons.length-1;i++){for(int j=i+1;j<persons.length;j++){context.write(new Text(persons[i]+"-"+persons[j]+":"), new Text(friend));}}}}/*第二阶段的reduce函数主要完成以下任务1.<人-人,list(共同朋友)> 中的“共同好友”进行拼接 最后输出<人-人,两人的所有共同好友> */static class SharedFriendReducer02 extends Reducer<Text, Text, Text, Text>{@Overrideprotected void reduce(Text key, Iterable<Text> values,Context context)throws IOException, InterruptedException {StringBuffer sb = new StringBuffer();Set<String> set = new HashSet<String>();for(Text friend : values){if(!set.contains(friend.toString()))set.add(friend.toString());}for(String friend : set){sb.append(friend.toString()).append(",");}sb.deleteCharAt(sb.length()-1);context.write(key, new Text(sb.toString()));}}public static void main(String[] args)throws Exception {Configuration conf = new Configuration();//第一阶段Job job1 = Job.getInstance(conf);job1.setJarByClass(SharedFriend.class);job1.setMapperClass(SharedFriendMapper01.class);job1.setReducerClass(SharedFriendReducer01.class);job1.setOutputKeyClass(Text.class);job1.setOutputValueClass(Text.class);FileInputFormat.setInputPaths(job1, new Path("H:/大数据/mapreduce/sharedfriend/input"));FileOutputFormat.setOutputPath(job1, new Path("H:/大数据/mapreduce/sharedfriend/output"));boolean res1 = job1.waitForCompletion(true);//第二阶段Job job2 = Job.getInstance(conf);job2.setJarByClass(SharedFriend.class);job2.setMapperClass(SharedFriendMapper02.class);job2.setReducerClass(SharedFriendReducer02.class);job2.setOutputKeyClass(Text.class);job2.setOutputValueClass(Text.class);FileInputFormat.setInputPaths(job2, new Path("H:/大数据/mapreduce/sharedfriend/output"));FileOutputFormat.setOutputPath(job2, new Path("H:/大数据/mapreduce/sharedfriend/output01"));boolean res2 = job2.waitForCompletion(true);System.exit(res1?0:1);}}
4.输出
1)第一阶段输出文件的内容
AI,K,C,B,G,F,H,O,DBA,F,J,ECA,E,B,H,F,G,KDG,C,K,A,L,F,E,HEG,M,L,H,A,F,B,DFL,M,D,C,G,AGMHOIO,CJOKBLD,EME,FOA,H,I,J,F
2)第二阶段输出文件的内容
A-B:C,EA-C:D,FA-D:E,FA-E:B,C,DA-F:B,C,D,E,OA-G:C,D,E,FA-H:C,D,E,OA-I:OA-J:B,OA-K:C,DA-L:D,E,FA-M:E,FB-C:AB-D:A,EB-E:CB-F:A,C,EB-G:A,C,EB-H:A,C,EB-I:AB-K:A,CB-L:EB-M:EB-O:AC-D:A,FC-E:DC-F:A,DC-G:A,D,FC-H:A,DC-I:AC-K:A,DC-L:D,FC-M:FC-O:A,ID-E:LD-F:A,ED-G:A,E,FD-H:A,ED-I:AD-K:AD-L:E,FD-M:E,FD-O:AE-F:B,C,D,ME-G:C,DE-H:C,DE-J:BE-K:C,DE-L:DF-G:A,C,D,EF-H:A,C,D,E,OF-I:A,OF-J:B,OF-K:A,C,DF-L:D,EF-M:EF-O:AG-H:A,C,D,EG-I:AG-K:A,C,DG-L:D,E,FG-M:E,FG-O:AH-I:A,OH-J:OH-K:A,C,DH-L:D,EH-M:EH-O:AI-J:OI-K:AI-O:AK-L:DK-O:AL-M:E,F
阅读全文
0 0
- MapReduce实现寻找共同好友
- MapReduce寻找共同好友
- 使用MapReduce实现寻找共同好友的案例
- MapReduce:共同好友
- Mapreduce实例---共同好友
- MapReduce找共同好友
- MapReduce找共同好友
- MapReduce分析共同好友
- MapReduce--6--求共同好友
- 寻找共同好友(hadoop解决方案)
- mapreduce系列(7)--查找共同好友
- MapReduce实战练习四:找出共同好友
- mapreduce应用-找出扣扣共同好友
- 关于如何使用MapReducer来寻找共同好友
- MapReduce--7--求共同好友--改进版JobControl
- MapReduce——求两个人的共同好友算法
- 共同好友
- 共同好友
- lua ...的使用
- 统计代码有效行数
- 省市联动的JSON格式数据
- 面试总结-成长之路
- 总结div水平居中的方法
- MapReduce实现寻找共同好友
- hdu 3999 The order of a Tree
- 数字统计(NOIP2010)
- Ubuntu 16.04 ssh安装--个人心得
- sparkSQL架构分析
- PHP进阶(第二弹:类和对象)
- 1.quartz框架了解
- maven eclipse tomcat 启动报错 java.lang.ClassNotFoundException: org.springframework.web.filter.Character
- Error:Execution failed for task ':app:validateSigningDebug'. > Keystore file D:\Android_keystore\deb