MapReduce可以实现一个简单的好友推荐,本文参考了文末博主的思路,个人感觉不错,自己修改部分代码也简单实现了,记录下。

数据准备

如下数据就是好友关系,同一行的两个人就是好友,需要在这数据里寻找两个人是否是潜在好友,即两人不是直接好友,但是却有共同的好友,需要将这样关系的两个人作为结果推荐出去。

clyang messi
clyang herry
clyang ronald
messi clyang
messi kaka
messi ronald
herry clyang
herry kaka
ronald herry
ronald clyang
ronald messi

思路分析

(1)首先按照第一个name来统计他的好友列表,即需要输出成clyang messi herry ronald这样一行行的数据,这样map的输出key就是第一个名字如clyang,value就是好友列表如messi herry ronald,这里使用一个MR来完成中间值的输出。

(2)根据上面MR的统计结果,在Map任务中,需将两人的名字和并到一起作为key,如果是直接好友,输出value记录为0,如果不是直接好友,但是有共同的好友,则value记录为1输出给reducer。用数字0和1来区分是否是直接好友,如clyang和messi是直接好友,则输出(clyang:messi, 0),而messi和herry都有共同的好友clyang,因此输出结果为(messi:herry,1)。接下来在Reduer会和并Map的输出结果,将分区结果和并后存入迭代器中,循环迭代器value,如果发现两人关系输出数字为0,则不再推荐,如果没有一个0出现,则推荐出去。

MapReduce实现好友推荐

第一轮MR

以下为第一轮MR示意图。

MapReduce实现好友推荐

Map端代码

package com.boe.friendRecommend;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * 先根据第一个name,分组求出它所有的朋友
 */
public class FriendMapper extends Mapper<LongWritable,Text,Text, Text> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //拆分每一行
        String[] s = value.toString().split(" ");
        //直接写出到map输出,第一个名字相同,会落在同一分区
        context.write(new Text(s[0]),new Text(s[1]));
    }
}
View Code

相关文章: