实验目的

初步认识图计算的知识点

复习mapreduce的知识点,复习自定义排序分组的方法

学会设计mapreduce程序解决实际问题

实验原理

  QQ好友推荐算法是所有推荐算法中思路最简单的,我们利用的思想就是好友的好友很有可能是自己的好友,而共同好友越多,说明两个人认识的可能性越大。其实这个想法属于图计算的内容,人际关系社交网络是很典型的图计算的内容,大家可以参考相关资料。我们今天就基于共同好友的想法实现。

1.实现思路
  我们已有的数据是每个人以及他的好友,我们无法直接从这个数据得到他的好友的好友,换一种思路我们能够知道他的所有好友都有一个共同好友就是他,例如A有两个好友B和C,如果B和C不是好友那我们可以把B推荐给C,因为B和C有一个共同好友。基于这种思路我们有了实现方案。
  第一个map,首先输出key为自己和每一个好友组合,value标识已经是好友,另外还有输出key为好友的两两组合,value为1代表共同好友个数。reduce判断得到的数据的value如果已经是共同好友就直接返回,否则就累加,就能得到每两个非好友的人的共同好友人数。
  这个思路有个问题,我们map的key为两个人的组合,但是组合A+B和组合B+A是一样的,所以我们在写出数据之前,应该对数据进行排序,保证不会同时出现A+B和B+A。另外最后我们得到了每两个人的共同好友个数,但是我们应该排序才能得到应该推荐的好友是哪些。在reduce进行排序的方法大家都懂,需要自定义输出类,实现compareTo方法,同时定义GroupingComparator类。

2.代码实现
  例如一行数据为 A、B、C。
  第一个map可以先对B,C排序,输出(A|B,2)(A|C,2)代表A和B、C已经是好友了,然后输出(B|C,1),代表B、C有一个共同好友,第一个reduce遍历value,遇到2就说明已经是好友,直接return,否则一直累加,写出两个人共同好友数量。
  第二个mapreduce可以自定义一个FriendOfFriend的输出类,有id,推荐好友id,共同好友数量三个属性,map读进来的数据直接封装成这样的对象写出,他的分组compareTo方法先比较id然后比较共同好友数量,然后分组函数直接按id分组。在reduce的时候每组数据就是id一样按照count排序好的FriendOfFriend对象,直接写出。

实验环境

1.操作系统
  操作机:Windows_7
  操作机默认用户名:hongya,密码:123456
2.实验工具
  IntelliJ IDEA

IDEA全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

  优点:
1)最突出的功能自然是调试(Debug),可以对Java代码,JavaScript,JQuery,Ajax等技术进行调试。其他编辑功能抛开不看,这点远胜Eclipse。
2)首先查看Map类型的对象,如果实现类采用的是哈希映射,则会自动过滤空的Entry实例。不像Eclipse,只能在默认的toString()方法中寻找你所要的key。
3)其次,需要动态Evaluate一个表达式的值,比如我得到了一个类的实例,但是并不知晓它的API,可以通过Code Completion点出它所支持的方法,这点Eclipse无法比拟。
4)最后,在多线程调试的情况下,Log on console的功能可以帮你检查多线程执行的情况。

  缺点:
1)插件开发匮乏,比起Eclipse,IDEA只能算是个插件的矮子,目前官方公布的插件不足400个,并且许多插件实质性的东西并没有,可能是IDEA本身就太强大了。
2)在同一页面中只支持单工程,这为开发带来一定的不便,特别是喜欢开发时建一个测试工程来测试部分方法的程序员带来心理上的不认同。
3)匮乏的技术文章,目前网络中能找到的技术支持基本没有,技术文章也少之又少。
4)资源消耗比较大,建个大中型的J2EE项目,启动后基本要200M以上的内存支持,包括安装软件在内,差不多要500M的硬盘空间支持。(由于很多智能功能是实时的,因此包括系统类在内的所有类都被IDEA存放到IDEA的工作路径中)。

  特色功能:
  智能选择
  丰富的导航模式
  历史记录功能
  JUnit的完美支持
  对重构的优越支持
  编码辅助
  灵活的排版功能
  XML的完美支持
  动态语法检测
  代码检查等等

步骤1:实验环境介绍

  本次试验和之前一样在本地运行,本地测试,数据也放在本地,由于数据是好友关系,大家可以自己生成数据进行测试。打开idea,本次的代码放在hellohadoop|com.hongya|day026下面,们可以进入D:/hongya/ideaspace/hellohadoop/src/com/hongya/day026查看源代码。有兴趣的同学也可以自行新建项目进行学习。

  1.1代码分析(此处打开操作机桌面的“idea64”进行操作)。
  第一个mapreduce实现类似Wordcount,只不过每次输出之前要排序,保证A+B和B+A都能输出A|B,另外直接好友多输出一个2标识已经是好友了。
  第二个mapreduce先定义一个FriendOfFriend类,compareTo方法先比较id然后比较共同好友数。另外自定义分组类,按照id分组。
  自定义一个FriendOfFriend的输出类,有id,推荐好友id,共同好友数量三个属性,map读进来的数据直接封装成这样的对象写出,他的分组compareTo方法先比较id然后比较共同好友数量,然后分组函数直接按id分组。在reduce的时候魅族数据就是id一样按照count排序好的FriendOfFriend对象,直接写出。

  FriendOfFriend:

public class FriendOfFriend implements WritableComparable<FriendOfFriend> {

private String username;

private String fof;

private int count;

//get set方法省略

public void readFields(DataInput arg0) throws IOException {

this.username=arg0.readUTF();

this.count=arg0.readInt();

this.fof=arg0.readUTF();

}

public void write(DataOutput arg0) throws IOException {

arg0.writeUTF(username);

arg0.writeInt(count);

arg0.writeUTF(fof);

}

/**

* 相当于 Object对象equals

*/

@Override

public int compareTo(FriendOfFriend o) {

int result = this.username.compareTo(o.getUsername());

if(result == 0){

return Integer.compare(o.count, this.getCount());

}

return result;

}

}

分组类FriendRecommendGroup:

public class FriendRecommendGroup extends WritableComparator {

public FriendRecommendGroup(){

super(FriendOfFriend.class,true);

}

public int compare(WritableComparable a, WritableComparable b) {

FriendOfFriend k1=(FriendOfFriend) a;

FriendOfFriend k2=(FriendOfFriend) b;

return k1.getUsername().compareTo(k2.getUsername());

}

}

吴裕雄--天生自然HADOOP操作实验学习笔记:qq好友推荐算法的更多相关文章

  1. 吴裕雄--天生自然HADOOP操作实验学习笔记:协同过滤算法

    实验目的 初步认识推荐系统 学会用mapreduce实现复杂的算法 学会系统过滤算法的基本步骤 实验原理 前面我们说过了qq的好友推荐,其实推荐算法是所有机器学习算法中最重要.最基础.最复杂的算法,一 ...

  2. 吴裕雄--天生自然HADOOP操作实验学习笔记:使用hive操作hbase

    实验目的 熟悉hive和hbase的操作 熟悉hadoop.hbase.hive.zookeeper的关系 熟练大数据环境的搭建 学会分析日志排除问题 实验原理 1.hive整合hbase原理 前面大 ...

  3. 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce代码编程

    实验目的 深入了解mapreduce的底层 了解IDEA的使用 学会通过本地和集群环境提交程序 实验原理 1.回忆mapreduce模型 前面进行了很多基础工作,本次实验是使用mapreduce的AP ...

  4. 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介

    实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...

  5. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase学生选课案例

    实验目的 复习hbase的shell操作和javaAPI操作 了解javaWeb项目的MVC设计 学会dao(数据库访问对象)和service层的代码编写规范 学会设计hbase表格 实验原理 前面我 ...

  6. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的javaAPI应用

    实验目的 进一步了解hbase的操作 熟悉使用IDEA进行java开发 熟悉hbase的javaAPI 实验原理 前面已经了解通过hbase的shell操作hbase,确实比较难以使用,另外通过hiv ...

  7. 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的shell应用v2.0

    HRegion 当表的大小超过设置值的时候,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集.对用户来说,每个表是一堆数据的集合,靠主键来区分.从物理上来说,一张表被拆分成了多块, ...

  8. 吴裕雄--天生自然HADOOP操作实验学习笔记:hive DDL

    实验目的 了解hive DDL的基本格式 了解hive和hdfs的关系 学习hive在hdfs中的保存方式 学习一些典型常用的hiveDDL 实验原理 有关hive的安装和原理我们已经了解,这次实验我 ...

  9. 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce和yarn命令

    实验目的 了解集群运行的原理 学习mapred和yarn脚本原理 学习使用Hadoop命令提交mapreduce程序 学习对mapred.yarn脚本进行基本操作 实验原理 1.hadoop的shel ...

随机推荐

  1. C语言知识点记录

    1,栈底指针不变,栈顶指针变化. 2,结构化程序包括:顺序,分支,循环. 3,详细设计的任务是为软件结构图的每一个模块确定实现算法和局部数据结构. 4,数据操纵语言:负责数据的操纵,包括查询及增,删, ...

  2. 「CF891C」Envy

    传送门 Luogu 解题思路 考虑最小生成树的几个性质: 所有最小生成树中边权相等的边的条数相等 在任意一颗最小生成树中,边权相等的边所联通的点集一定 那么我们考虑把边权相等的边单独拿出来考虑. 每次 ...

  3. JavaScript的变量提升机制

    变量提升 JavaScript的变量提升有两种,用var声明的变量以及用function声明的变量. 用var声明的变量 我们先来看下面这段代码,a的值是多少 代码1 console.log(a); ...

  4. Centos7 虚拟环境安装Django 出现ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' %Database.sqlite_version)错误

    Centos7 虚拟环境安装Django 出现SQLite版本问题 raise ImproperlyConfigured('SQLite 3.8.3 or later is required (fou ...

  5. Python中令人迷惑的4个引用

    第一个:执行时机的差异 1. array = [1, 8, 15] g = (x for x in array if array.count(x) > 0) array = [2, 8, 22] ...

  6. SpringBoot与Shiro整合

    一.数据库设计 ​ 这里主要涉及到五张表:用户表,角色表(用户所拥有的角色),权限表(角色所涉及到的权限),用户-角色表(用户和角色是多对多的),角色-权限表(角色和权限是多对多的).表结构建立的sq ...

  7. webpack使用devtool :source map插件

    链接 : https://www.cnblogs.com/chris-oil/p/8856020.html

  8. Mybatis中mapper.xml的使用

    详解多对多,mybatis多对多查询(xml方式和注解方式) 链接:https://blog.csdn.net/qq_42524262/article/details/98383977 链接:http ...

  9. component:(resolve) => require

    resolve => require(['../pages/home.vue'], resolve)这种写法是异步模块获取,打包的时候每次访问这个路由的时候会单调单个文件,按需加载,不过这种写法 ...

  10. LPWAN

    典型LPWA技术: 1 Sigfox技术由同名的法国Sigfox公司设计研发,成立于2010年,因为Sigfox网络由Sigfox公司为主导进行全球部署,这样能最大程度保证网络服务质量的统一性和稳定性 ...