MapReduce实现QQ好友推荐

大家都知道qq用户量上亿,每个用户又有很多的好友,因此,数据量十分的庞大,如何才能实现QQ的好友推荐呢?

下面举一个例子:

A有QQ好友B

B有QQ好友C

则A,C有可能是好友。

当A登录的时候,则会向A推荐C,当C登录的时候,则会向C推荐A。

Demo

输入数据

map阶段
key:主
value:从
key:从
value:主
将一条记录分别作为key,value进行输出。
tom-->jason
jason-->tom
tom-->lgd
lgd-->tom

reduce阶段
将同一个key的values值进行两两组合。
package FriendsRecommended;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class FindFriends {
    private final static String INPUT_PATH = "hdfs://liguodong:8020/liguodong";
    private final static String OUTPUT_PATH = "hdfs://liguodong:8020/liguodong/QQFriendRecommended";

    public static void main(String[] args) throws IOException,
    URISyntaxException, ClassNotFoundException, InterruptedException {

        Configuration conf = new Configuration();
        final FileSystem fileSystem = FileSystem.get(new URI(INPUT_PATH),conf);
        if(fileSystem.exists(new Path(OUTPUT_PATH)))
        {
            fileSystem.delete(new Path(OUTPUT_PATH),true);
        }
        Job job = Job.getInstance(conf, "qq friend recommended"); 

        job.setJarByClass(FindFriends.class);

        FileInputFormat.addInputPath(job, new Path(INPUT_PATH));
        job.setMapperClass(MyMapper.class);
        job.setReducerClass(MyReudcer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        FileOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH));

        //提交作业
        System.exit(job.waitForCompletion(true) ? 0 : 1);

    }

    public static class MyMapper extends Mapper<LongWritable,Text,Text,Text>{
        @Override
        protected void map(LongWritable k1, Text v1, Context context)
                throws IOException, InterruptedException {
            String line = v1.toString();
            String[] ss = line.split("\\s+");

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

    public static class MyReudcer extends Reducer<Text, Text, Text, Text>{
        @Override
        protected void reduce(Text k2, Iterable<Text> v2s,Context context)
                throws IOException, InterruptedException {
            Set<String> set = new HashSet<String>();
            for (Text v2:v2s) {
                set.add(v2.toString());
            }
            if (set.size()>1) {
                for (Iterator i = set.iterator();i.hasNext();) {

                    String qqName = (String)i.next();
                    for (Iterator j = set.iterator();j.hasNext();){
                        String otherqqName = (String)j.next();
                        if(!qqName.equals(otherqqName)){
                            context.write(new Text(qqName), new Text(otherqqName));
                        }
                    }
                }
            }
        }

    }
}

输出结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 13:22:57

MapReduce实现QQ好友推荐的相关文章

MapReduce -- 好友推荐

MapReduce实现好友推荐: 张三的好友有王五.小红.赵六; 同样王五.小红.赵六的共同好友是张三; 在王五和小红不认识的前提下,可以通过张三互相认识,给王五推荐的好友为小红, 给小红推荐的好友是王五,就是王五.小红.赵六互为推荐关系. 根据分析就是有相同好友的人物之间为推荐关系,但要排除本来两人就是好友的情况. 计算一个人的好友推荐关系,推荐关系值为1,然后计算所有人的好友推荐关系,最终将推荐关系值相加,计算出最值得推荐的几个好友. 简单的说就是两个非好友的人,存在共同好友的人数越多,说明

MapReduce实现好友推荐

MapReduce可以实现一个简单的好友推荐,本文参考了文末博主的思路,个人感觉不错,自己修改部分代码也简单实现了,记录下. 数据准备 如下数据就是好友关系,同一行的两个人就是好友,需要在这数据里寻找两个人是否是潜在好友,即两人不是直接好友,但是却有共同的好友,需要将这样关系的两个人作为结果推荐出去. clyang messi clyang herry clyang ronald messi clyang messi kaka messi ronald herry clyang herry ka

MapReduce – 基本思路之推荐引擎

理解MapReduce关键两个步骤: 首先是构想出结构的数据结构,这种数据结构可以支撑你的业务分析使用:是要理解这种模式的处理元素. 第二步,分析原始数据的结构是怎样的: 第三步,基于原始数据结构以及目标数据结构,在分析map的实现逻辑,返回值什么,sort-shuffle之后的值什么,这个值也是reduce的入口参数,然后是reduce的逻辑是什么,以符合目标结构: map和reduce在处理数据上面的很大差别在于map之后会有一个汇总过程,按照key进行汇聚(发生在sort-shuffle阶

19-hadoop-fof好友推荐

好友推荐的案例, 需要两个job, 第一个进行好友关系度计算, 第二个job将计算的关系进行推荐 1, fof关系类 package com.wenbronk.friend; import org.apache.hadoop.io.Text; /** * 定义fof关系 * @author root * */ public class Fof extends Text{ public Fof() { super(); } /**' * 不论谁在前,返回一致的顺序 * @param a * @pa

QQ好友请求自动同意软件(管家协议登录)

QQ好友请求自动同意软件 软件功能:批量登录一批QQ小号,自动同意QQ小号中的好友添加请求![QQ加人方式修改器(免费哦)] 特别提醒:此款软件不适合处理请求非常非常多的QQ!少量请求还是得心应手的! 两款都是一样的,QQ登录协议不同罢了,推荐QQ管家协议登录,登录验证码不会有中文! 注意:新手不会用就算了,免费软件我们禁止咨询客服的!客服不解答免费软件的任何问题!客服繁忙请谅解!觉得不好就删除这款软件即可!如有BUG可以联系客服哦!警告:软件纯属是本人无聊制作!不喜欢或觉得没用的请勿下载即可!

QQ好友在线/离线,怎么测试?

即时通讯是目前internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,那么今天主要针对QQ好友在线状态/QQ群友在线状态功能出发,一起思考其中的实现原理以及我们如何去测试此功能? 当大家在使用QQ的时候,是否和我一样有如下疑问: 在好友列表中为什么可以实时的看到qq好友的在线.离线等状态? 在QQ群的群友列表中能看到当前群友的在线.离线等状态,是如何实现的? 作为测试工程师究竟该如何去测试里面用到的技术? 我带着这些问题,去搜集了一些资料进行了解.学习和总结后,现分享给大家. 关

javascript社交平台分享-新浪微博、QQ微博、QQ好友、QQ空间、人人网

整理的五个社交平台的分享 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h2>分享</h2> <div id="sina">新浪微博</div>

仿QQ好友列表界面的实现

TableView有2种style:UITableViewStylePlain 和 UITableViewStyleGrouped. 但是QQ好友列表的tableView给人的感觉似乎是2个style效果都有,但是tableView不能实现2种效果同时存在. 其实只是用到了Plain这个style,只是在cell的个数显示上做了个处理(个人见解,希望可以帮到有需要的人.....) 当通讯录那一组的cell的组头视图中的button是普通状态下的时候,并不是不显示cell,而是显示一个没有任何内容

java模仿qq好友面板的布局(BoxLayout问题)

.............. JLabel ll = new JLabel(dlg.getNameText() + ":" + dlg.getIPText(), ii[index], JLabel.LEFT); tmp = new JPanel();//将标签添加到这个面板中 tmp.setLayout(new FlowLayout(FlowLayout.CENTER)); tmp.setBackground(new Color(255, 0, 255)); /* * BoxLayou