项目名称:粉丝互粉
项目说明:如下所示,分别给出微博用户信息和其粉丝信息,如第一行:“:”左边的代表用户A,右边是关注A的粉丝。
用户和粉丝之间是单向关系,也即E是A的粉丝,但是A不一定是E的粉丝。
项目需求:用mapreduce找出两两之间有共同粉丝的用户对,及他俩的共同好友。如:A-B C,E
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
需求解读:以为第一行为例进行说明:
根据MapReduce的设置,给出的信息以文本的形式存放在一个InputPath处,在Map阶段通过RecoderReader中的read()方法每次读取文本信息的一行数据,并组装成K-V对传递给map方法,因此传入map的Key-in与Key-value分别是起始偏移量(LongWritable)和第一行的文本数据(Text):
LongWritable Key-in:key,Text value-in:value,
第一次调用Map方法时的key-value="A:B,C,D,F,E,O";
我们要找两两用户间的共同粉丝,不如先找出每个用户分别是谁的粉丝,如C是用户A,B,F,G,H,K的共同粉丝,然后再将A,B,F,G,H,K两两组合作为key-out,C作为value-out传送出去,那么reduce阶段框架自然会帮助我们将有着同一个key-out的value值组装为一个Iteratable形式的value-out,也就实现了我们的需求:找出了两两用户间的共同粉丝。
示例图:
示例代码:
Step1:
package com.itcast.bigdata.mr.fense2;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapred