MapReduce 计算共同好友

MapReduce 计算共同好友

Scroll Down

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

2、步骤要求分析

使用mapreduce计算出用户间的共同好友(friend.txt)

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
(1)需求

每一行代表一个用户和他的好友列表。需要求出哪些人两两之间有共同好友,及他俩的共同好友都有谁。例如从前2行记录中可以看出,C、E是A、B的共同好友,最终的形式如下:

(2)实现思路
1)第1个MapReduce

1.map

找出每个用户都是谁的好友,例如:
读一行A:B,C,D,F,E,O(A的好友有这些,反过来拆开,这些人中的每一个都是A的好友)
输出<B,A> <C,A> <D,A> <F,A> <E,A> <O,A>
一行B:A,C,E,K
输出<A,B> <C,B> <E,B> <K,B>
……

2.reduce

key相同的会分到一组,例如:
<C,A><C,B><C,E><C,F><C,G>......
Key:C
value: [ A, B, E, F, G ]
 
意义是:C是这些用户的好友。
 
遍历value就可以得到:
A B 有共同好友C
A E 有共同好友C
...
B E有共同好友 C
B F有共同好友 C
 
输出:
<A-B,C>
<A-E,C>
<A-E,B>
<A-G,C>
<B-E,C>
<B-F,C>
.....
2)第2个MapReduce

 
对上一步的输出结果进行计算。

1.map

读出上一步的结果数据,组织成key value直接输出
 
例如:
读入一行<A-B,C>
直接输出<A-B,C>
``` 
**2.reduce**
```bash
读入数据,key相同的在一组
<A-B,C><A-B,F><A-B,G>...... 
 
输出:
A-B C,F,G,..... 

这样就得出了两个用户间的共同好友列表,具体实现代码可以去资源界面下载。