吴裕雄--天生自然HADOOP操作实验学习笔记:qq好友推荐算法
实验目的
初步认识图计算的知识点
复习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好友推荐算法的更多相关文章
- 吴裕雄--天生自然HADOOP操作实验学习笔记:协同过滤算法
实验目的 初步认识推荐系统 学会用mapreduce实现复杂的算法 学会系统过滤算法的基本步骤 实验原理 前面我们说过了qq的好友推荐,其实推荐算法是所有机器学习算法中最重要.最基础.最复杂的算法,一 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:使用hive操作hbase
实验目的 熟悉hive和hbase的操作 熟悉hadoop.hbase.hive.zookeeper的关系 熟练大数据环境的搭建 学会分析日志排除问题 实验原理 1.hive整合hbase原理 前面大 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce代码编程
实验目的 深入了解mapreduce的底层 了解IDEA的使用 学会通过本地和集群环境提交程序 实验原理 1.回忆mapreduce模型 前面进行了很多基础工作,本次实验是使用mapreduce的AP ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介
实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase学生选课案例
实验目的 复习hbase的shell操作和javaAPI操作 了解javaWeb项目的MVC设计 学会dao(数据库访问对象)和service层的代码编写规范 学会设计hbase表格 实验原理 前面我 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的javaAPI应用
实验目的 进一步了解hbase的操作 熟悉使用IDEA进行java开发 熟悉hbase的javaAPI 实验原理 前面已经了解通过hbase的shell操作hbase,确实比较难以使用,另外通过hiv ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase的shell应用v2.0
HRegion 当表的大小超过设置值的时候,HBase会自动地将表划分为不同的区域,每个区域包含所有行的一个子集.对用户来说,每个表是一堆数据的集合,靠主键来区分.从物理上来说,一张表被拆分成了多块, ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hive DDL
实验目的 了解hive DDL的基本格式 了解hive和hdfs的关系 学习hive在hdfs中的保存方式 学习一些典型常用的hiveDDL 实验原理 有关hive的安装和原理我们已经了解,这次实验我 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:mapreduce和yarn命令
实验目的 了解集群运行的原理 学习mapred和yarn脚本原理 学习使用Hadoop命令提交mapreduce程序 学习对mapred.yarn脚本进行基本操作 实验原理 1.hadoop的shel ...
随机推荐
- 卫哲VS投行女,秋后算账是阿里的企业文化吗?
编辑 | 于斌 出品 | 于见(mpyujian) 提到马云,大家都会想到淘宝,阿里,也都期待阿里巴巴的马云爸爸能够给我们免单,从而省去我们每天为钱烦恼的后顾之忧.虽然今天要吃的瓜是有关阿里的,但是并 ...
- 【Python与线程】
" 目录 一.全局解释器锁GIL 二.Python线程模块的选择 三.线程的创建 三.锁机制 四.信号量 五.事件 六.条件 七.定时器 八.线程队列 九.线程池 补充:线程安全 imp ...
- 「JSOI2015」字符串树
「JSOI2015」字符串树 传送门 显然可以树上差分. 我们对于树上每一条从根出发的路径都开一 棵 \(\text{Trie}\) 树,那么我们就只需要在 \(\text{Trie}\) 树中插入一 ...
- 爬虫,工具 - Splash
What is it? Splash is a javascript rendering service. It's a lightweight web browser with an HTTP AP ...
- 容器远程访问vnc--CentOS 6.8安装和配置VNC
对于用惯了WIN系统的朋友来说,没有图形化操作界面的Linux用起来实在太难受了.实际上,Linux也是有图形化操作界面的,这就是VNC.接下来本文将告诉大家如何在CentOS 6.8下安装和配置 V ...
- 正则表达式regex回溯分析
正则表达式的回溯 现在我们来正式认识一下回溯.以字符串“abbc”为例,正则表达式为“ab{1,3}c”,再匹配的时候,a.b.b,匹配完成,这时候,正则表达式会继续用c和b进行比较,发现不符合,这时 ...
- string和stringBuffer,stringBuilder的区别
1,String类的内容一旦声明后是不可改变的,改变的只是其内存的指向,而StringBuffer类的对象内容是可以改变的. 2,对于StringBuffer,不能像String那样直接通过赋值的方式 ...
- JS利用HTML5的Web Worker实现多线程
需求:有一个长时间的斐波拉契的计算希望放在分线程中计算,计算的得到结果后再返回给主线程展示,再计算的时候不冻结页面 var number = 55;//传入分线程的参数 var worker = ne ...
- Cisco AP-如何调整LAP信道
GUI方法: CLI的方法:根据对应的接口去调整信道,信道带宽,传输功率等信息吧.(Cisco Controller) >config slot 0 antenna Configures the ...
- SpringMvc 项目配置
spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...