您的位置:首页 > 其它

MapReduce学习之好友推荐

2016-01-11 16:53 411 查看

背景

在QQ,微博等社交软件中都会有好友推荐的功能,本案例将使用
MapReduce
实现一个简单的好友推荐的功能。想象一下,程序如何推荐好友呢?假设A和B为好友关系,B和C为好友关系,那么我们就假定A和C有好友关系。更复杂的情况,A和B、C均为好友关系,B、C和D均为好友关系,那么我们就假定A和D有好友关系。这样的关系可以称为二度关系。在实际过程中可以判断这种二度关系的数量进行好友推荐,或者进行三度关系的数量判断来进行推荐。

分析

数据如下形式:
A   B
B   C
C   D
B   E
A   D

map阶段可以得到如下格式:
Key:A  Value:B  D
Key:B  Value:C  E
Key:C  Value:D
reduce阶段可以将value进行笛卡尔积运算就可以得到二度关系。


代码实现

java
实现如下

map 函数体:
protected void map(LongWritable key, Text value,
Mapper<LongWritable, Text, Text, Text>.Context context)
throws java.io.IOException, InterruptedException {

String line = value.toString();
String[] ss = line.split("\t");

context.write(new Text(ss[0]), new Text(ss[1]));
context.write(new Text(ss[1]), new Text(ss[0]));

};
reduce 函数体:
protected void reduce(Text key, java.lang.Iterable<Text> value,
Reducer<Text, Text, Text, Text>.Context context)
throws java.io.IOException, InterruptedException {

Set<String> set = new HashSet<String>();
for(Text v : value ){
set.add(v.toString());
}

if(set.size() > 1){
for (Iterator j = set.iterator(); j.hasNext();) {
String name = (String) j.next();
for (Iterator i = set.iterator(); i.hasNext();) {
String other = (String) i.next();
if(!name.equals(other)){
context.write(new Text(name), new Text(other));
}
}
}
}

};


运行结果如下





reduce
阶段完成笛卡尔积运算的时候,可以用多种算法可以提高速度,这里只是简单的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: