热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MapReduce好友推荐

MapReduce实现好友推荐:张三的好友有王五、小红、赵六;同样王五、小红、赵六的共同好友是张三;在王五和小红不认识的前提下,可以通过张三互相认识,给王五推荐的好友为小红,给小红

MapReduce实现好友推荐:

技术分享

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

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

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

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

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

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

数据:

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

实现代码:

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

计算结果:

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

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

小丽:小玲       2

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

MapReduce -- 好友推荐


推荐阅读
  • 本指南详细介绍了如何利用华为云对象存储服务构建视频点播(VoD)平台。通过结合开源技术如Ceph、WordPress、PHP和Nginx,用户可以高效地实现数据存储、内容管理和网站搭建。主要内容涵盖华为云对象存储系统的配置步骤、性能优化及安全设置,为开发者提供全面的技术支持。 ... [详细]
  • 深入解析:Synchronized 关键字在 Java 中对 int 和 Integer 对象的作用与影响
    深入探讨了 `Synchronized` 关键字在 Java 中对 `int` 和 `Integer` 对象的影响。尽管初看此题似乎简单,但其实质在于理解对象的概念。根据《Java编程思想》第二章的观点,一切皆为对象。本文详细分析了 `Synchronized` 关键字在不同数据类型上的作用机制,特别是对基本数据类型 `int` 和包装类 `Integer` 的区别处理,帮助读者深入理解 Java 中的同步机制及其在多线程环境中的应用。 ... [详细]
  • 虚函数表指针vptr的功能测试与分析
    类的虚函数调用依赖于虚函数表来实现。虚函数表是由编译器自动生成的一段内存区域,用于存储包含虚函数的类中每个虚函数的入口地址。这些入口地址本质上是指针类型,从而使得动态绑定成为可能。本文对虚函数表指针(vptr)的功能进行了详细的测试与分析,探讨了其在多态性和继承机制中的作用及其性能影响。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • VS2019 在创建 Windows 恢复点时出现卡顿问题及解决方法
    在使用 Visual Studio 2019 时,有时会在创建 Windows 恢复点时遇到卡顿问题。这可能是由于频繁的自动更新导致的,每次更新文件大小可能达到 1-2GB。尽管现代网络速度较快,但这些更新仍可能对系统性能产生影响。本文将探讨该问题的原因,并提供有效的解决方法,帮助用户提升开发效率。 ... [详细]
  • 为了提升单位内部沟通效率,我们开发了一套飞秋软件与OA系统的消息接口服务系统。该系统能够将OA系统中的审批、通知等信息自动同步至飞秋平台,确保员工在使用飞秋进行日常沟通的同时,也能及时获取OA系统的各类重要信息,从而实现无缝对接,提高工作效率。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
author-avatar
Emily嘿嘿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有