目录
需求1:所有人两两之间的共同好友
原文件:
A:B,C,D,F,E,O
B:A,C,E,K
C:F,A,D,I
D:A,E,F,L
E:B,C,D,M,L
F:A,B,C,D,E,O,M
G:A,C,D,E,F
H:A,C,D,E,O
I:A,O
J:B,O
K:A,C,D
L:D,E,F
M:E,F,G
O:A,H,I,J
需要求出哪些人两两之间有共同好友,以及他们的共同好友都有谁。互相不为好友的人也有可能有共同好友。
分析
需要两次mr
第一阶段
Mapper输入为<人,该人的所有好友>,输出<该人的一位好友,人>
Reducer输入为<一位好友,拥有该好友的所有人)>,输出为<人-人,一位好友>
第二阶段
Mapper 默认
Reducer输出为<人-人,共同好友>
举个例子
A:B,C,D
B:A,C,D
C:B
则第一阶段
mapper输出为:<B,A>,<C,A>,<D,A>,<A,B>,<C,B>,<D,B>,<B,C>
reducer输入为:<A,(B)>,<B,(A,C)>,<C,(A,B)>,<D,(A,B)>
reducer输出为:<A-C,B>,<A-B,C>,<A-B,D>
第二阶段
reducer输出:<A-B,BD>,<A-C,B>
代码
Mapper1,输入格式为默认的TextInputFormat
public class MyMapper1 extends Mapper<LongWritable,Text,Text,Text>{
Text coFriend = new Text();
Text name = null;
Map<String,String> hm = new HashMap<String,String>();
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
StringTokenizer itr1 = new StringTokenizer(value.toString(), ":");
name = new Text(itr1.nextToken());
StringTokenizer itr2 = new StringTokenizer(itr1.nextToken(), ",");
whil