Welcome to aparke’s blog
Mapreduce经典案例两种方式求共同好友
题目描述
给出A-O个人中每个人的好友列表,求出哪些人两两之间有共同好友,以及他们的共同好友都有谁
数据样例:
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输出样例:
A-B: C,E
A-C: D,F
A-D: E,F
A-E: B,C,D
A-F: B,C,D,E,O
A-G: C,D,E,F
A-H: C,D,E,O
A-I: O
方法一
处理逻辑:
实现思路:
- 实现共同好友分两步实现:
- 第一步:只求哪些人两两间有某个共同好友
- 1.将每组的user读到的第一个数据也就是冒号前面的值设置为value
- 2.将后面他的好友设置为key
- 一组数据A:B,C,D,F,E,O
- map输出reduce输入为:B A C A D A F A …
- 3.reduce循环遍历过来的value(friends)
- 将每组的数据加入到list中进行排序(默认排序)
- 然后将一组数据通过两层循环A拼接E,F,J然后从E开始继续,形成好友对
- 4.reduce端输出的key为好友对,value则为map端的key也就是friend
- 第二步:
- 将上次的结果作为输入,两两好友对作为key,拼接他们相同的value
处理逻辑代码
共同好友实现第一步
package cn.aparke.mr.friend; |
共同好友实现第二步
package cn.aparke.mr.friend; |
方法二
逻辑思路
此题旨在求两人之间的共同好友,原信息是<人,该人的所有好友>,因此首先以好友为键,人为值,交给reduce找出拥有此好友的所有人;再将这些人中两两配对作为键,之前的键(好友)作为值交给reduce去合并
简而言之我打算分成两个步骤,两次迭代* 1)求出每一个人都是哪些人的共同好友 * 2)把这些人(用共同好友的人)作为key,其好友作为value输出
原文链接:https://blog.csdn.net/u012808902/article/details/77513188
一个代码实现两个job 需注意第一个job结束不能system.exit()
package cn.aparke.mr.friend; |