第五天课程大纲:1、社交粉丝的数据分析:求共同好友2、倒排索引的建立3、自定义inputFormat合并小文件 4、自定义outputformat5、分组求topN6、MapReduce的其他补充 了解7、mapreduce的参数优化 理解8、yarn的资源调度管理
以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的,即A的好友列表中有B,但B可能把A删除了)
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
求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?
教案上的解题思路(未使用该思路):
第一步
map
读一行 A:B,C,D,F,E,O
输出 <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>
REDUCE
拿到的数据比如<C,A><C,B><C,E><C,F><C,G>......
输出:
<A-B,C>
<A-E,C>
<A-F,C>
<A-G,C>
<B-E,C>
<B-F,C>.....
第二步
map
读入一行<A-B,C>
直接输出<A-B,C>
reduce
读入数据 <A-B,C><A-B,F><A-B,G>.......
输出: A-B C,F,G,.....
实际思路:
可以使用多个mapreduce来实现B是哪些用户的好友???B 出现在这么多人的好友列表里面 :A-E-F-J那么就可以说 A-E B A-F B A-J B E-F B E-J B F-J B
问题:如何求某一个好友,出现在哪些用户列表里面B-A C-A D-A F-A E-A O-A B-E C-E D-E M-E L-E
如果以B作为key2 以用户 作为Value2相同B的数据都会到同一个reduce里面形成一个集合 B <A,E>然后在reduce当中将我们的数据转换成这样的一种形式 key3: A-E-F-J value3:B
以冒号切开,下标为1的字段再用逗号切开,然后循环遍历
用户列表 好友F-D-O-I-H-B-K-G-C- AE-A-J-F- BK-A-B-E-F-G-H- CG-K-C-A-E-L-F-H- DG-F-M-B-H-A-L-D- EM-D-L-A-C-G- FM- GO- HC-O- IO- JB- KE-D- LF-E- MJ-I-H-A-F- O
E-A-J-F- B E A J F 对切割之后的数组进行排序 A E F JG-K-C-A-E-L-F-H- D G K C A E L F H 对切割之后的数组进行排序 A C E F G H L
首先对这些字符串进行切割,按照 -进行切开成为一个数组,然后再对数组进行排序,然后双层for循环遍历往外发送数据给reduce
key2 value2 A-E B E-J B-E-F BA-J B-A-F B-J-F B-
G-K D-G-C D-G-A D-G-E D-G-L D-G-F D-G-H D-
A-E D
到reduce阶段形成这种形式A-E <B,D>可以求出 A-E 有共同好友 B和 D
详见代码
转载于:https://www.cnblogs.com/mediocreWorld/p/11029304.html
