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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我儿子的视力低怎么办 小孩子课文看书都不会读怎么办 宝宝衣服买小了怎么办 拉拉裤腰围小了怎么办 一周九个月宝宝发烧怎么办 8个月的婴儿37.7怎么办 宝宝发烧37度3怎么办 2岁宝宝发烧37度怎么办 3个月新生儿发烧怎么办 生完孩子肚子松弛怎么办 6个月婴儿高烧怎么办 7个月婴儿高烧怎么办 11个月婴儿高烧怎么办 4个月婴儿高烧怎么办 新生宝宝混合喂养消化不良怎么办 四个月的宝宝不追听不追视怎么办 宝宝母乳换奶粉拉肚子怎么办 奶牛产奶脂肪低怎么办 新生儿混合喂养不喝水怎么办 小孩子咳嗽怎么办有什么偏方 混合喂养宝宝不喝奶粉怎么办 混合喂养宝宝不吃奶粉怎么办 混合喂养宝宝不吃奶瓶怎么办 混合喂养的宝宝不吃奶粉怎么办 三个月的宝宝突然不吃奶粉怎么办 四个月宝宝拉绿屎推拿怎么办 三个月大的宝宝消化不良怎么办 婴儿大便常规正常的腹泻怎么办 宝宝十个月母乳不够吃怎么办 吃药上吐腹泻在3怎么办 房子买了新生儿户口怎么办 吃海鲜拉稀拉水怎么办 吃海鲜腹泻拉水怎么办 两个月宝宝不爱睡觉怎么办 2个月宝宝干呕怎么办 9个月宝宝拉稀的怎么办 宝宝拉肚子快一个月了怎么办 满月宝宝发烧38度怎么办 大人腹泻10天了怎么办 十个月宝贝拉水怎么办 十个月宝宝脱水哭闹怎么办