需求
以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的)
求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?
A:B,C,D,F,E,O
B:A,C,E,K
C:A,B,D,E,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
思路分析
源数据
A:B,C,D,F,E,O
B:A,C,E,K
C:A,B,D,E,I
......
我们想要的分析结果
A-B C-E
A-C B-D-E
B-C A-E
MapReduce1:
MapReduce思想
Map->分 Reduce->合
K1 V1
0 A:B,C,D,F,E,O
15 B:A,C,E,K
26 C:A,B,D,E,I
-----------Map阶段-----------
-----------Map阶段的MapTak阶段-----------
K1 V1 ==>K2 V2
K2好友V2
B的好友A(注意:这样理解错误)(数据中的好友关系是单向的)
K2是V2的好友
B是A的好友
K2 V2
B A
C A
D A
F A
E A
O A
A B
C B
E B
K B
A C
B C
D C
E C
I C
-----------Map阶段的MapTak阶段-----------
------------Shuffle阶段-------------------
------------Map阶段的的Shuffle阶段-------------------
排序
K2 V2
A B
A C
B A
B C
C B
C A
D A
D C
E A
E B
E C
F A
I C
K B
O A
------------Map阶段的的Shuffle阶段-------------------
-----------Map阶段-----------
-----------Reduce阶段---------------------------
------------Reduce阶段的Shuffle阶段-------------------
分组 - 相同键的值会放在同一个集合<>
K2 V2
A <B,C>
B <A,C>
C <B,A>
D <A,C>
E <A,B,C>
F A
I C
K B
O A
K2是V2的好友 V2成员不止一个时 表示K2是V2[....]的好友
A B-C 代表A是B和C的好友
------------Reduce阶段的Shuffle阶段-------------------
------------Shuffle阶段---------------------------
-----------Reduce阶段的ReduceTask阶段---------------------------
K2 V2 ==>K3 V3
这里完成键值互换即可 因为这里的V2有些是集合 处理起来步骤会多一点 留到下一个MapReduce 转为Text 再拆分拼接 则更加符合MapReduce的思想
当然硬是要在这里拆也是可以 遍历集合 拼成字符串 转为数组排序分组即可(不知道有没有更好的方法)
K2 V2 ==>K3 V3
K2 V2
A <B,C>
B <A,C>
C <B,A>
D <A,C>
E <A,B,C>
F A
I C
K B
O A
------------------
K3 V3
B-C A
A-C B
B-A C
A-C D
A-B-C E
A F
C I
B K
A O
B-C A 代表B和C的共同好友是A
K3的共同好友V3 K3成员只有一个时 表示K3的好友V3
-----------Reduce阶段的ReduceTask阶段---------------------------
-----------Reduce阶段---------------------------
MapReduce2:
K1 V1
offset B-C A
offset A-C B
offset B-A C
offset A-C D
offset A-B-C E
offset A F
offset C I
offset B K
offset A O
MapTask
K1 V1 ==>K2 V2
V1要转为K2的部分,首先要按字典顺序排列 便于转为键后 Shuffle的排序分组
V1要转为K2的部分,成员个数大于2时,需求是求两人的共同好友 需要两两拆分
K2的共同好友V2 K2成员只有一个时 表示K2的好友V2
K2 V2
B-C A
A-C B
A-B C
A-C D
A-B E
A-C E
B-C E
A F
C I
B K
A O
Shuffle 排序
K2 V2
A-B E
A-B C
A-C D
A-C E
A-C B
A F
A O
B-C A
B-C E
B K
C I
Shuffle 分组-相同键的值会放在同一个集合<>
K2 V2
A-B <E,C>
A-C <D,E