MapReduce实现好友推荐:

张三的好友有王五、小红、赵六; 同样王五、小红、赵六的共同好友是张三;

在王五和小红不认识的前提下,可以通过张三互相认识,给王五推荐的好友为小红,

给小红推荐的好友是王五,就是王五、小红、赵六互为推荐关系。

根据分析就是有相同好友的人物之间为推荐关系,但要排除本来两人就是好友的情况。

计算一个人的好友推荐关系,推荐关系值为1,然后计算所有人的好友推荐关系,最终将推荐关系值相加,计算出最值得推荐的几个好友。

简单的说就是两个非好友的人,存在共同好友的人数越多,说明这两个人越值得互相推荐。

数据:

王五    李四    小丽    小玲
小丽 王五 赵六
李四 王五 张三 赵六 小红
小玲 王五 张三 赵六
张三 小玲 李四 赵六
赵六 小丽 小玲 张三 李四 小红
小红 李四 赵六

实现代码:

 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; import java.io.IOException; /**
* 好友推荐:
* 计算两个非好友的推荐值,就是两个非好友的共同好友数
*
* Created by Edward on 2016/7/12.
*/
public class RunJob { public static void main(String[] args){ System.setProperty("HADOOP_USER_NAME", "root"); Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://node1:8020"); try {
FileSystem fs = FileSystem.get(conf); Job job = Job.getInstance(conf);
job.setJarByClass(RunJob.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class); //需要指定 map out 的 key 和 value
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path("/test/friend/input")); Path path = new Path("/test/friend/output");
if(fs.exists(path))//如果目录存在,则删除目录
{
fs.delete(path,true);
}
FileOutputFormat.setOutputPath(job, path); boolean b = job.waitForCompletion(true);
if(b)
{
System.out.println("OK");
} } catch (Exception e) {
e.printStackTrace();
} } public static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> { @Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] str = value.toString().split("\t"); for(int i=1; i<str.length; i++) {
//a 的好友是 b
context.write(new Text(str[0] + ":" + str[i]), new IntWritable(0));
//b 的好友是 a
context.write(new Text(str[i] + ":" + str[0]), new IntWritable(0));
for (int j = i + 1; j < str.length; j++) {
// A 的推荐好友是 B
context.write(new Text(str[i] + ":" + str[j]), new IntWritable(1));
// B 的推荐好友是 A
context.write(new Text(str[j] + ":" + str[i]), new IntWritable(1));
}
}
}
} public static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0;
for(IntWritable i: values)
{
if(i.get() == 0) {//两个人已经是好朋友的,排除在外
sum = 0;
//break;
return;
}
sum += i.get();
}
context.write(key, new IntWritable(sum));
}
}
}

计算结果:

小丽:小玲
小丽:小红
小丽:张三
小丽:李四
小玲:小丽
小玲:小红
小玲:李四
小红:小丽
小红:小玲
小红:张三
小红:王五
张三:小丽
张三:小红
张三:王五
李四:小丽
李四:小玲
王五:小红
王五:张三
王五:赵六
赵六:王五

对结果进行简单的核对,比对图

小丽:小玲       2

小丽和小玲的共同好友数为2,分别为:王五,赵六

MapReduce -- 好友推荐的更多相关文章

  1. MapReduce案例-好友推荐

    用过各种社交平台(如QQ.微博.朋友网等等)的小伙伴应该都知道有一个叫 "可能认识" 或者 "好友推荐" 的功能(如下图).它的算法主要是根据你们之间的共同好友 ...

  2. 19-hadoop-fof好友推荐

    好友推荐的案例, 需要两个job, 第一个进行好友关系度计算, 第二个job将计算的关系进行推荐 1, fof关系类 package com.wenbronk.friend; import org.a ...

  3. 吴裕雄--天生自然HADOOP操作实验学习笔记:qq好友推荐算法

    实验目的 初步认识图计算的知识点 复习mapreduce的知识点,复习自定义排序分组的方法 学会设计mapreduce程序解决实际问题 实验原理 QQ好友推荐算法是所有推荐算法中思路最简单的,我们利用 ...

  4. 【Hadoop学习之十】MapReduce案例分析二-好友推荐

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 最应该推荐的好友TopN,如何排名 ...

  5. MapReduce案例二:好友推荐

    1.需求 推荐好友的好友 图1: 2.解决思路 3.代码 3.1MyFoF类代码 说明: 该类定义了所加载的配置,以及执行的map,reduce程序所需要加载运行的类 package com.hado ...

  6. 【大数据系列】MapReduce示例好友推荐

    package org.slp; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import ...

  7. hadoop计算二度人脉关系推荐好友

    https://www.jianshu.com/p/8707cd015ba1 问题描述: 以下是qq好友关系,进行好友推荐,比如:老王和二狗是好友 , 二狗和春子以及花朵是好友,那么老王和花朵 或者老 ...

  8. 升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)

          Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系 ...

  9. 使用MapReduce实现二度人脉搜索算法

    一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...

随机推荐

  1. github上手实践教程

    简介: SSH公私钥的使用 github的使用 git 工具的基本使用 基本步骤: 一.github的使用 1.github账号的创建[官网一步一步创建就行了,这一步骤省略] 2.创建远程仓库: 创建 ...

  2. Android 运行时权限处理(from jianshu)

    https://www.jianshu.com/p/e1ab1a179fbb 翻译的国外一篇文章. android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 ...

  3. jquery刷新页面的实现代码(局部及全页面刷新)

    局部刷新: 这个方法就多了去了,常见的有以下几种: $.get方法,$.post方法,$.getJson方法,$.ajax方法如下 前两种使用方法基本上一样 下面介绍全页面刷新方法:有时候可能会用到  ...

  4. centos 安装golang笔记

    1.使用yum安装 yum install go 这个命令可以将go环境安装到linux上. 2.配置gopath 第一步安装成功的go命令会被放入/usr/lib/golang/bin /usr/l ...

  5. PRINCE2是什么?

    PRINCE是PRoject IN Controlled Environment(受控环境下的项目管理)的简称. PRINCE2描述了如何以一种逻辑性的.有组织的方法,按照明确的步骤对项目进行管理. ...

  6. mac os maverick下安装nginx+php-fpm via homebrew

    自己虽然平时爱折腾,却很少有记下来的习惯,除非碰到特别多问题的部署才会有冲动.今天看同事折腾git,在旁边看着他mac上的evernote满满的记了好几篇,全是技术相关的记录,忽然很感慨.过去解决了很 ...

  7. twemproxy源码分析

    twemproxy是twitter开源的redis/memcached 代理,数据分片提供取模,一致性哈希等手段,维护和后端server的长连接,自动踢除server,恢复server,提供专门的状态 ...

  8. Mysql使用binlog恢复数据解决误操作问题的两种方法

    为保证没有其他参数配置影响,重新安装配置了一台最小化安装的CentOS7虚拟机 1. 基础知识
 安装mysql5.6数据库Mysql binlog初步理解 2. 配置mysql 开启binlog.修 ...

  9. 设置UINavigationController标题的属性

    设置UINavigationController标题的属性 self.title = @"产品详情"; [self.navigationController.navigationB ...

  10. swift中变量的几种类型

    swift中变量的几种类型 swift中变量分为 optional,non-optional 以及 implicitly unwrapped optional 这几种类型 var nullablePr ...