MapReduce实现共同好友,要求实现下列要求: 以下是微信的好友列表数据.冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的)e A:B,C,D,F,E,O,E B:A,C,E,K C:F,A,D,l 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 l:A,O ]:B,O K:A,C,D L:D,E,F M:E.F,G O:A,H,I,J 求出哪些人两两之间有共同好友.及他俩的共同好友都有谁?
时间: 2023-09-11 09:12:21 浏览: 97
大数据学习(八):mapreduce编程案例-求两人之间的共同好友
好的,这是一个经典的MapReduce问题。让我们来分析一下。
首先,我们需要将输入数据转化为键值对。对于每个用户,我们需要将他和他的每个好友作为键值对中的键,并将他的好友列表作为值。例如,对于用户A和他的好友B、C、D,我们需要将如下键值对放入MapReduce的输入中:
```
(A,B) -> (B,C,D,F,E,O,E)
(A,C) -> (B,C,D,F,E,O,E)
(A,D) -> (B,C,D,F,E,O,E)
(A,F) -> (B,C,D,F,E,O,E)
(A,E) -> (B,C,D,F,E,O,E)
(A,O) -> (B,C,D,F,E,O,E)
```
接下来,我们需要编写Mapper函数。Mapper函数的输入是键值对中的键和值,我们需要将每个值中的所有好友和键组成键值对,输出到Reducer中。例如,对于上述输入中的第一条键值对,Mapper函数需要将如下三条键值对输出:
```
(B,C) -> (A)
(B,D) -> (A)
(B,F) -> (A)
(B,E) -> (A)
(B,O) -> (A)
(C,D) -> (A)
(C,F) -> (A)
(C,E) -> (A)
(C,O) -> (A)
(D,F) -> (A)
(D,E) -> (A)
(D,O) -> (A)
(F,E) -> (A)
(F,O) -> (A)
(E,O) -> (A)
```
接下来,我们需要编写Reducer函数。Reducer函数的输入是键和值的列表,对于每个键,我们需要将所有值中的用户取交集,得到这些用户的共同好友,并将其输出为键值对。例如,对于上述Mapper的输出,Reducer函数需要将如下键值对输出:
```
(B,C) -> (A)
(B,D) -> (A)
(B,F) -> (A)
(B,E) -> (A)
(B,O) -> (A)
(C,D) -> (A)
(C,F) -> (A)
(C,E) -> (A)
(C,O) -> (A)
(D,F) -> (A)
(D,E) -> (A)
(D,O) -> (A)
(F,E) -> (A)
(F,O) -> (A)
(E,O) -> (A)
```
最后,我们需要将Reducer的输出按照字典序排序,输出结果即为两两之间共同好友的列表,以及这些好友的列表。例如,上述输出按照字典序排序后,应该输出如下结果:
```
(B,C) -> (A)
(B,D) -> (A)
(B,E) -> (A)
(B,F) -> (A)
(B,O) -> (A)
(C,D) -> (A)
(C,E) -> (A)
(C,F) -> (A)
(C,O) -> (A)
(D,E) -> (A)
(D,F) -> (A)
(D,O) -> (A)
(E,F) -> (A)
(E,O) -> (A)
(F,O) -> (A)
```
阅读全文