MapReduce小案例——找朋友
需求:在朋友圈内有一票人,他们之间加了微信好友,现在我们需要找出他们两两共同的好友?
有上图可知,输入数据,他们所拥有的好友为:friend1.txt
A:B,D,F,I,J,O
B:A,C,E,G,K,P
C:B,D,F,H,R
D:A,C,E,H,L,S
E:B,D,H,M
F:A,C,I,J
G:B,K,N,O
H:C,D,E,M
I:A,F,J,L,Q
J:A,F,I,N,S
K:B,G,L,P,R
L:D,I,K,P,Q
M:E,H,O,S
N:G,J,Q,R,
O:A,G,M,P,R
P:B,K,O,Q,S
Q:I,L,N,P,R,S
R:C,K,N,O,Q
S:D,J,M,N,P,Q
可能出现的情况:
1.他们之间关系都维持地非常的好,没有人被拉黑,或者删除。
2.他们之间相处可能不是那么的融洽,有人被单方拉黑或删除了。
第一种情况的解决方案:
思路:仅需一次MapReduce:
1.Map阶段每行中主人被单独切分,则后面的好友两两进行排列组合,这可以得出主人便是好友对中两人的共同好友,好友对作为key,主人作为值输出到reduce中。
2.Reduce阶段,对输入value的共同好友进行拼接,便可以的两人的共同好友。
package com.nike.hadoop.mapred.friend01;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class FriendMap extends Mapper<LongWritable, Text, Text, Text> {
private Text keyOut = new Text();
private Text valOut = new Text();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] split = value.toString().split(":");
String[] friends = split[1].split(",");
for (int i = 0; i < friends.length-1; i++) {
for (int j = i+1; j < friends.length; j++) {
if ((friends[i].compareTo(friends[j])>0)){
String out = friends[j]+"-"+friends[i];
keyOut.set(out);
valOut.set(split[0]);
context.write(keyOut,valOut);
}else{
String out = friends[i]+"-"+friends[j];
keyOut.set(out);
valOut.set(split[0]);
context.write(keyOut,valOut);
}
}
}
}
}
package com.nike.hadoop.mapred.friend01;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
import java.util.Iterator;
public class FriendReduce extends Reducer<Text,Text,Text, Text> {
private Text valOut = new Text();
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
StringBuilder sb = new StringBuilder();
Iterator<Text> iterator = values.iterator();
while(iterator.hasNext()){
String friend = iterator.next().toString();
sb.append("\t"+friend);
}
valOut.set(sb.toString());
context.write(key,valOut);
}
}
package com.nike.hadoop.mapred.friend01;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop