实验目的

初步认识图计算的知识点

复习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. 洛谷 P5018 对称二叉树(搜索)

    嗯... 题目链接:https://www.luogu.org/problem/P5018 其实这道题直接搜索就可以搜满分: 首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点 ...

  2. java -jar命令运行jar包时指定外部依赖jar包 linxux or windows

    前尘回顾: setup.bat [chenquan@hostuser tartest]$ cat ../setup.sh javac -encoding UTF-8 -Djava.ext.dirs=. ...

  3. php redis 集群扩展类文件

    <?php /** * redis集群驱动 */ namespace Common\Api; class RedisCluster{ protected $servers=array( '192 ...

  4. OpenCV介绍

    OpenCV 是什么 OpenCV是计算机视觉开源库,主要算法涉及图像处理和机器学习相关方法. 是 Intel 公司贡献出来的,俄罗斯工程师贡献大部分 C/C++ 代码 在多数图像处理相关的应用程序中 ...

  5. C++98常用特性介绍——mutable关键字

    讲mutable前,先讲一下const函数,讲const函数前,先讲一下函数前后加const的区别 一.C++函数前后加const的区别 1)函数前加const:普通函数或非静态成员函数前均可加con ...

  6. PS进程及杀掉进程!

    1.程序和进程的关系(1)程序 保存在硬盘.光盘等介质中的可执行代码和数据 静态保存的代码 (2)进程 在 CPU 及内存中运行的程序代码 动态执行的代码 父.子进程:每一个进程可以创建一个或多个进程 ...

  7. linux磁盘空间挂载

    (1)查看磁盘空间 df -hl (3)查看硬盘及分区信息 fdisk -l (4)格式化新分区 mkfs.ext3 /dev/xvdb (5)将磁盘挂载在/www/wwwroot/default目录 ...

  8. 设计模式课程 设计模式精讲 3-4 依赖倒置原则讲解+coding

    1 课程讲解 1.1 定义 1.2 优点 1.3 细节描述 2 代码演练 2.0 代码展示优点 2.1 非面向接口编程 2.2 面向接口编程1 传参 2.3 面向接口编程2 构造函数 2.4 面向接口 ...

  9. Vulnhub_bossplayersCTF 记录

    目录 经验 & 总结 步骤流水 经验 & 总结 CTF这种东西还是有一些脑洞和约定俗成的东西: 比如多次编码 比如cmd参数传入执行的命令 步骤流水 端口信息搜集nmap -A 192 ...

  10. pycharm中Terminal中运行用例

     1.设置终端路径 2.单个用例文件运行 3.多个用例文件,例如加载用例的文件运行 1.可能会出现如下错误(参考:https://blog.csdn.net/qq_36829091/article/d ...