大数据Hadoop学习之——好友推荐_量化数据库 好友推荐-程序员宅基地

技术标签: 算法  好友推荐  mapreduce  hadoop  大数据  

一、算法说明

好友关系如图:

                                       

   1、直接相连的表示两个人是直接好友关系;

   2、两个人有相同的好友表示两个人是间接好友(当然可能两个人同时也是直接好友,如图hello和hive)。

   3、好友推荐列表就是按照两个用户的共同好友数量排名

 

二、MapReduce分析

1、分两步MapReduce计算完成;

2、第一步先得到用户的间接好友关系数目,注意有直接好友关系的用户需要过滤掉;

3、第二步根据间接好友关系数就可以得到用户推荐列表。

 

三、MapReduce实现

输入数据

tom hello hadoop cat
word hadoop hello hive
cat tom hive
mr hive hello
hive cat hadoop word hello mr
hadoop tom hive word
hello tom word hive mr

第一个是当前用户,后面的是其好友列表

 

第一步——计算好友间接关系数

一、mapper输出两种数据

        1、对各用户的好友列表好友俩俩组合,输出间接好友关系;

        2、当前用户和好友列表好友一一组合,输出直接好友关系。

注意!!!这里好友关系key需要顺序排序,避免重复记录,如hello:tom和tom:hello都表示同样两个人的关系。

public class FriendMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
	private final Text text = new Text();

	private final IntWritable mval = new IntWritable();

	@Override
	protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
		//样本数据:tom hello hadoop cat
		String[] users = StringUtils.split(value.toString(), ' ');
		for (int i = 1; i < users.length; i++) {
			//和好友组成直接关系,组合好友关系按顺序排列,确保user1和user2不会因为顺序问题,而被认为是两对关系
			text.set(MrCommUtil.orderConcat(users[0], users[i]));
			mval.set(0);
			context.write(text, mval);
			for (int j = i + 1; j < users.length; j++) {
				//列表好友俩俩组合间接关系
				text.set(MrCommUtil.orderConcat(users[i], users[j]));
				mval.set(1);
				context.write(text, mval);
			}
		}
	}

}

 

二、reducer统计同两个用户的间接关系数,并过滤已经是直接关系的一组用户。

public class FriendReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
	private final IntWritable rval = new IntWritable();

	@Override
	protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
		//数据样本
		//hadoop word	0
		//hadoop word	1
		//hadoop word	0
		int num = 0;
		for (IntWritable value : values) {
			if (value.get() == 0) {
				return;
			}
			num += 1;
		}
		rval.set(num);
		context.write(key, rval);
	}
}

 

三、输出结果集如下

cat:hadoop	2
cat:hello	2
cat:mr	1
cat:word	1
hadoop:hello	3
hadoop:mr	1
hive:tom	3
mr:tom	1
mr:word	2
tom:word	2

 

第二步——统计最佳推荐好友

一、mapper输入数据集为第一步的结果集,map把记录映射成正反两组

public class Friend2Mapper extends Mapper<LongWritable, Text, FriendRelation, IntWritable> {
	private final FriendRelation mkey = new FriendRelation();

	private final IntWritable mval = new IntWritable();

	@Override
	protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
		//数据样本:cat:hadoop	2
		String[] strs = StringUtils.split(value.toString(), '\t');
		String[] users = StringUtils.split(strs[0], ':');
		mkey.setFrom(users[0]);
		mkey.setTo(users[1]);
		int n = Integer.parseInt(strs[1]);
		mkey.setN(n);
		mval.set(n);
		context.write(mkey, mval);
		mkey.setFrom(users[1]);
		mkey.setTo(users[0]);
		context.write(mkey, mval);
	}
}

 

二、排序比价器根据第一个用户和关系数倒排序

public class Friend2SortComparator extends WritableComparator {

	public Friend2SortComparator() {
		super(FriendRelation.class, true);
	}

	@Override
	public int compare(WritableComparable a, WritableComparable b) {
		//排序先根据from,同from再根据n排倒序
		FriendRelation f1 = (FriendRelation) a;
		FriendRelation f2 = (FriendRelation) b;
		int i = f1.getFrom().compareTo(f2.getFrom());
		if (i == 0) {
			return -Integer.compare(f1.getN(), f2.getN());
		}
		return i;
	}
}

 

三、分组比较器根据第一个用户分组

public class Friend2GroupComparator extends WritableComparator {

	public Friend2GroupComparator() {
		super(FriendRelation.class, true);
	}

	@Override
	public int compare(WritableComparable a, WritableComparable b) {
		//分组只根据from分组
		FriendRelation f1 = (FriendRelation) a;
		FriendRelation f2 = (FriendRelation) b;
		int i = f1.getFrom().compareTo(f2.getFrom());
		return i;
	}

}

四、reduce取出关系数最大的推荐关系

public class Friend2Reducer extends Reducer<FriendRelation, IntWritable, Text, IntWritable> {
	private final Text rkev= new Text();
	private final IntWritable rval = new IntWritable();

	@Override
	protected void reduce(FriendRelation key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
		//样本数据:
		//cat:hadoop	2
		// cat:hello	2
		// cat:mr	1
		// cat:word	1
		int n = key.getN();
		//输出最大间接关系数的所有推荐
		for (IntWritable value : values) {
			if (n != value.get()) {
				break;
			}
			rkev.set(key.getFrom() + "->" + key.getTo());
			rval.set(key.getN());
			context.write(rkev, rval);
		}
	}
}

五、输出最终结果,用户推荐分最高的前两名

cat->hello	2
cat->hadoop	2
hadoop->hello	3
hello->hadoop	3
hive->tom	3
mr->word	2
tom->hive	3
word->mr	2
word->tom	2

 

六、完整代码及测试数据详见码云:hadoop-test传送门

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xdkb159/article/details/108143622

智能推荐

NeurIPS2020丨近期必读【元学习】论文推荐_neurips 2020 论文推荐-程序员宅基地

文章浏览阅读2.7k次。AMiner平台由清华大学计算机系研发,拥有我国完全自主知识产权。平台包含了超过2.3亿学术论文/专利和1.36亿学者的科技图谱,提供学者评价、专家发现、智能指派、学术地图等科技情报专业化服务。系统2006年上线,吸引了全球220个国家/地区1000多万独立IP访问,数据下载量230万次,年度访问量超过1100万,成为学术搜索和社会网络挖掘研究的重要数据和实验平台。AMiner平台:https://www.aminer.cn/导语:NeurIPS,神经信息处理系统大会(Conferenceon Ne._neurips 2020 论文推荐

如何成为一名优秀的项目经理-程序员宅基地

文章浏览阅读141次。在一个项目团队中,灵魂人物就是项目经理,一个优秀的项目经理往往能够把握项目的节奏,成功的利用各种资源来为项目服务,就如一个武林高手,无论面对的是高手的围攻(多种用户无休无止的需求变更),还是面临恶劣的自然环境(团队不稳定,人心涣散),都能游刃有余,从容不迫。我们的项目经理往往是从技术人员转变而来,有较深的技术背景,但是光有技术是做不好项目的,优秀的项目经理往往不实际开发产品或者参与很..._一个技术人员项目管理如何成为优秀的项目经理

智能农业与农业大数据:提高农业生产效率的关键技术-程序员宅基地

文章浏览阅读495次,点赞19次,收藏9次。1.背景介绍智能农业是一种利用信息技术、通信技术、电子技术、自动化技术、生物技术等多种技术手段,为农业生产提供科学的信息支持,实现农业生产的高效化、智能化、可持续化和环保化的新兴产业。智能农业是农业信息化的重要组成部分,也是农业现代化的重要手段。智能农业的发展具有重要的意义。在全球经济全面国际化的背景下,人类对于食物安全的需求日益增长。为了应对这一挑战,我们需要提高农业生产效率,提高农业产...

企业号开发php,微信企业号-开发笔记-1-程序员宅基地

文章浏览阅读217次。开发微信企业号,首先需要实名认证,然后可以获得200人关注的企业号,认证以后可以获得1000人关注,企业号可以建立若干个应用,每个应用相当于一个订阅号或者服务好功能,但是没有发送消息限制,本文假设已经成功申请企业号,需要使用企业号的回调模式来开发,配置成功后是这样的: 配置服务器代码(PHP):include_once"WXBizMsgCrypt.php";//假设企业号在公众平台上设置的参数..._企业微信开发包 php

PS入门|如何使用“主体”功能进行抠图?_框选主体抠图-程序员宅基地

文章浏览阅读362次,点赞10次,收藏10次。学习PS并不难,难的是不想去折腾,还没开始就想放弃了,所以一直没学会。_框选主体抠图

认证基石_冯泰照片-程序员宅基地

文章浏览阅读1.9k次。我的空间 主页|空间装扮博客|写新文章相册|上传照片好友|找新朋友档案|留言板ftai08 0 | 我的消息(0/0) | 我的空间 | 百度空间 | 百度首页 | 退出 信息技术细望东洲桃浪暖,雁峰烟雨实堪夸。朱陵洞内诗千首,青草桥头酒百家。石鼓江山锦锈华,西湖夜放白莲花。花药春溪龙现爪,岳屏雪岭鸟喧哗。 主页博客相册|个人档案 |好友 |管理中心 文章列表 写新文章 您正在查看 "认证基石" _冯泰照片

随便推点

sql拼接同一字段中的数据_用SQL将Oracle中同一列的多行记录拼接成一个字符串-程序员宅基地

文章浏览阅读442次。-- 原始数据-- a 111-- b 222-- a 333-- a 444-- b 555-- 最终结果-- a 111*333*444SELECTL4.L_TIME,MAX(SUBSTR(L4.分组内容,2)) 最终字段值FROM(SELECTL3.L_TIME,SYS_CONNECT_BY_PATH(L3.L_CONTENT,'*') AS 分组内容FROM(SEL..._sql同一列的做个值进行拼接

H71H-25P立式止回阀型号解析_止回阀h77f-25p的字母含义-程序员宅基地

文章浏览阅读68次。H71H-25P型号字母含义解析H71H-25P是德特森阀门常用的立式止回阀型号字母分别代表的意思是:H——代表阀门类型《止回阀》7——代表连接方式《对夹》1——代表结构形式《升降》H——代表阀座堆焊《不锈钢》-代表分隔键25——代表公称压力《2.5MPA》P——代表阀体材料《不锈钢CF8》_止回阀h77f-25p的字母含义

cmd move 文件到指定目录下 拒绝访问_cmd move 拒绝访问-程序员宅基地

文章浏览阅读6.9k次。移动文件时,提示C:\Users>move Twisted-19.2.1-cp38-cp38m-win_amd64.whl chenminzhen\appdata\local\programs\python\python37拒绝访问。移动了 0 个文件。解决办法:命令提示符——右键——以管理员身份运行,再输入move命令,问题解决!!!C:\WINDOWS\sys..._cmd move 拒绝访问

react 首页加载loading-程序员宅基地

文章浏览阅读8.2w次。首页加载loading,放在#root里面,代码如下:<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <meta name="renderer" content="webkit|ie-comp|ie-stand"> ..._s86w.xyz

conda pack环境迁移并下载安装离线包_conda导出环境离线安装包-程序员宅基地

文章浏览阅读798次,点赞15次,收藏20次。训练服务器为了安全起见,限制不能联网,无法直接创建虚拟环境及安装模型的依赖库,所以需要把另一台测试服务器已经部署好的虚拟环境迁移到训练服务器上,并在不能联网的情况下安装一些离线包。过程记录如下记录。_conda导出环境离线安装包

关于网络连接状态的编程_网络连接用什么程序编写-程序员宅基地

文章浏览阅读894次。1. 可以用WMI (Win2K & XP):(首先要在VS.NET中创建一个项目,然后在添加引用中引用一个.net的装配件:System.Management.dll,这样你的项目才能使用WMI)with Windows 2000 & XP, UNDOCUMENTED: MSNdis_MediaConnectStatus - NdisMediaConnectStatus :_网络连接用什么程序编写

推荐文章

热门文章

相关标签