MapReduce实现好友推荐:

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

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

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

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

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

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

数据:

  1. 王五 李四 小丽 小玲
  2. 小丽 王五 赵六
  3. 李四 王五 张三 赵六 小红
  4. 小玲 王五 张三 赵六
  5. 张三 小玲 李四 赵六
  6. 赵六 小丽 小玲 张三 李四 小红
  7. 小红 李四 赵六

实现代码:

  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.FileSystem;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.IntWritable;
  5. import org.apache.hadoop.io.LongWritable;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Job;
  8. import org.apache.hadoop.mapreduce.Mapper;
  9. import org.apache.hadoop.mapreduce.Reducer;
  10. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  11. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  12.  
  13. import java.io.IOException;
  14.  
  15. /**
  16. * 好友推荐:
  17. * 计算两个非好友的推荐值,就是两个非好友的共同好友数
  18. *
  19. * Created by Edward on 2016/7/12.
  20. */
  21. public class RunJob {
  22.  
  23. public static void main(String[] args){
  24.  
  25. System.setProperty("HADOOP_USER_NAME", "root");
  26.  
  27. Configuration conf = new Configuration();
  28.  
  29. conf.set("fs.defaultFS", "hdfs://node1:8020");
  30.  
  31. try {
  32. FileSystem fs = FileSystem.get(conf);
  33.  
  34. Job job = Job.getInstance(conf);
  35. job.setJarByClass(RunJob.class);
  36. job.setMapperClass(MyMapper.class);
  37. job.setReducerClass(MyReducer.class);
  38.  
  39. //需要指定 map out 的 key 和 value
  40. job.setOutputKeyClass(Text.class);
  41. job.setOutputValueClass(IntWritable.class);
  42.  
  43. FileInputFormat.addInputPath(job, new Path("/test/friend/input"));
  44.  
  45. Path path = new Path("/test/friend/output");
  46. if(fs.exists(path))//如果目录存在,则删除目录
  47. {
  48. fs.delete(path,true);
  49. }
  50. FileOutputFormat.setOutputPath(job, path);
  51.  
  52. boolean b = job.waitForCompletion(true);
  53. if(b)
  54. {
  55. System.out.println("OK");
  56. }
  57.  
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61.  
  62. }
  63.  
  64. public static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
  65.  
  66. @Override
  67. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  68.  
  69. String[] str = value.toString().split("\t");
  70.  
  71. for(int i=1; i<str.length; i++) {
  72. //a 的好友是 b
  73. context.write(new Text(str[0] + ":" + str[i]), new IntWritable(0));
  74. //b 的好友是 a
  75. context.write(new Text(str[i] + ":" + str[0]), new IntWritable(0));
  76. for (int j = i + 1; j < str.length; j++) {
  77. // A 的推荐好友是 B
  78. context.write(new Text(str[i] + ":" + str[j]), new IntWritable(1));
  79. // B 的推荐好友是 A
  80. context.write(new Text(str[j] + ":" + str[i]), new IntWritable(1));
  81. }
  82. }
  83. }
  84. }
  85.  
  86. public static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  87.  
  88. @Override
  89. protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  90.  
  91. int sum = 0;
  92. for(IntWritable i: values)
  93. {
  94. if(i.get() == 0) {//两个人已经是好朋友的,排除在外
  95. sum = 0;
  96. //break;
  97. return;
  98. }
  99. sum += i.get();
  100. }
  101. context.write(key, new IntWritable(sum));
  102. }
  103. }
  104. }

计算结果:

  1. 小丽:小玲
  2. 小丽:小红
  3. 小丽:张三
  4. 小丽:李四
  5. 小玲:小丽
  6. 小玲:小红
  7. 小玲:李四
  8. 小红:小丽
  9. 小红:小玲
  10. 小红:张三
  11. 小红:王五
  12. 张三:小丽
  13. 张三:小红
  14. 张三:王五
  15. 李四:小丽
  16. 李四:小玲
  17. 王五:小红
  18. 王五:张三
  19. 王五:赵六
  20. 赵六:王五

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

  1. 小丽:小玲 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. js获取url中参数名也参数值

    要撮利用js获取url中参数名也参数值这个不多见了,但我今天需要这样操作,下面我来给大家介绍一下具体的实例方法.   在已知参数名的情况下,获取参数值,使用正则表达式能很容易做到. js的实现方法如下 ...

  2. 杀死进程-LeetCode-582

    英文版 582. Kill ProcessGiven n processes, each process has a unique PID (process id) and its PPID (par ...

  3. 润乾V4报表批量打印

     背景说明 在应用中,经常遇到,批量打印的需求,批量打印,顾名思义,就是点击一次打印按钮,能打印多张报表. 下面,我们来介绍一下怎么样实现批量打印的 应用举例: Jsp代码 <% //rep ...

  4. Java设计模式----观察者模式详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  5. Object、T(以下代指泛型)、?的区别

    因为最近看了很多项目底层都使用了T,?泛型,于是百度了一下有如下理解 我们先来试着理解一下Object类,学习Java的应该都知道Object是所有类的父类,注意:那么这就意味着它的范围非常广!首先记 ...

  6. Oracle EBS 日记账

    select b.status, h.je_source, (select USER_JE_CATEGORY_NAME from GL_JE_CATEGORIES where JE_CATEGORY_ ...

  7. ETL探索之旅

    ETL(Ectract Transform Load) 抽取-转换-加载 ETL 商业软件: Informatica IBM DataStage Microsoft SSIS Oracle  ODI ...

  8. 用Model来计算cell的高度

    用Model来计算cell的高度 效果: 将计算cell高度的方法直接移植到Model当中,初始化的瞬间就计算好了高度,非常好用! 源码: Model // // Model.h // // Copy ...

  9. 使用CADisplayLink写秒表

    使用CADisplayLink写秒表 效果: 源码: StopWatch.h 与 StopWatch.m // // StopWatch.h // ShowTime // // Created by ...

  10. QuickBI助你成为分析师-数据建模(二)

    摘要: 数据集编辑功能界面介绍以及常见问题总结. 在数据集编辑界面可以进行数据建模来更好的展示数据,创建数据集默认将数值类型字段作为度量,日期.字符串等类型作为维度,度量可以根据维度分组展示.下面来介 ...