MapReduce -- 好友推荐
MapReduce实现好友推荐:
张三的好友有王五、小红、赵六; 同样王五、小红、赵六的共同好友是张三;
在王五和小红不认识的前提下,可以通过张三互相认识,给王五推荐的好友为小红,
给小红推荐的好友是王五,就是王五、小红、赵六互为推荐关系。
根据分析就是有相同好友的人物之间为推荐关系,但要排除本来两人就是好友的情况。
计算一个人的好友推荐关系,推荐关系值为1,然后计算所有人的好友推荐关系,最终将推荐关系值相加,计算出最值得推荐的几个好友。
简单的说就是两个非好友的人,存在共同好友的人数越多,说明这两个人越值得互相推荐。
数据:
- 王五 李四 小丽 小玲
- 小丽 王五 赵六
- 李四 王五 张三 赵六 小红
- 小玲 王五 张三 赵六
- 张三 小玲 李四 赵六
- 赵六 小丽 小玲 张三 李四 小红
- 小红 李四 赵六
实现代码:
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Job;
- import org.apache.hadoop.mapreduce.Mapper;
- import org.apache.hadoop.mapreduce.Reducer;
- import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
- import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- import java.io.IOException;
- /**
- * 好友推荐:
- * 计算两个非好友的推荐值,就是两个非好友的共同好友数
- *
- * Created by Edward on 2016/7/12.
- */
- public class RunJob {
- public static void main(String[] args){
- System.setProperty("HADOOP_USER_NAME", "root");
- Configuration conf = new Configuration();
- conf.set("fs.defaultFS", "hdfs://node1:8020");
- try {
- FileSystem fs = FileSystem.get(conf);
- Job job = Job.getInstance(conf);
- job.setJarByClass(RunJob.class);
- job.setMapperClass(MyMapper.class);
- job.setReducerClass(MyReducer.class);
- //需要指定 map out 的 key 和 value
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(IntWritable.class);
- FileInputFormat.addInputPath(job, new Path("/test/friend/input"));
- Path path = new Path("/test/friend/output");
- if(fs.exists(path))//如果目录存在,则删除目录
- {
- fs.delete(path,true);
- }
- FileOutputFormat.setOutputPath(job, path);
- boolean b = job.waitForCompletion(true);
- if(b)
- {
- System.out.println("OK");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- String[] str = value.toString().split("\t");
- for(int i=1; i<str.length; i++) {
- //a 的好友是 b
- context.write(new Text(str[0] + ":" + str[i]), new IntWritable(0));
- //b 的好友是 a
- context.write(new Text(str[i] + ":" + str[0]), new IntWritable(0));
- for (int j = i + 1; j < str.length; j++) {
- // A 的推荐好友是 B
- context.write(new Text(str[i] + ":" + str[j]), new IntWritable(1));
- // B 的推荐好友是 A
- context.write(new Text(str[j] + ":" + str[i]), new IntWritable(1));
- }
- }
- }
- }
- public static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
- @Override
- protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
- int sum = 0;
- for(IntWritable i: values)
- {
- if(i.get() == 0) {//两个人已经是好朋友的,排除在外
- sum = 0;
- //break;
- return;
- }
- sum += i.get();
- }
- context.write(key, new IntWritable(sum));
- }
- }
- }
计算结果:
- 小丽:小玲
- 小丽:小红
- 小丽:张三
- 小丽:李四
- 小玲:小丽
- 小玲:小红
- 小玲:李四
- 小红:小丽
- 小红:小玲
- 小红:张三
- 小红:王五
- 张三:小丽
- 张三:小红
- 张三:王五
- 李四:小丽
- 李四:小玲
- 王五:小红
- 王五:张三
- 王五:赵六
- 赵六:王五
对结果进行简单的核对,比对图
- 小丽:小玲 2
小丽和小玲的共同好友数为2,分别为:王五,赵六
MapReduce -- 好友推荐的更多相关文章
- MapReduce案例-好友推荐
用过各种社交平台(如QQ.微博.朋友网等等)的小伙伴应该都知道有一个叫 "可能认识" 或者 "好友推荐" 的功能(如下图).它的算法主要是根据你们之间的共同好友 ...
- 19-hadoop-fof好友推荐
好友推荐的案例, 需要两个job, 第一个进行好友关系度计算, 第二个job将计算的关系进行推荐 1, fof关系类 package com.wenbronk.friend; import org.a ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:qq好友推荐算法
实验目的 初步认识图计算的知识点 复习mapreduce的知识点,复习自定义排序分组的方法 学会设计mapreduce程序解决实际问题 实验原理 QQ好友推荐算法是所有推荐算法中思路最简单的,我们利用 ...
- 【Hadoop学习之十】MapReduce案例分析二-好友推荐
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 最应该推荐的好友TopN,如何排名 ...
- MapReduce案例二:好友推荐
1.需求 推荐好友的好友 图1: 2.解决思路 3.代码 3.1MyFoF类代码 说明: 该类定义了所加载的配置,以及执行的map,reduce程序所需要加载运行的类 package com.hado ...
- 【大数据系列】MapReduce示例好友推荐
package org.slp; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import ...
- hadoop计算二度人脉关系推荐好友
https://www.jianshu.com/p/8707cd015ba1 问题描述: 以下是qq好友关系,进行好友推荐,比如:老王和二狗是好友 , 二狗和春子以及花朵是好友,那么老王和花朵 或者老 ...
- 升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)
Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系 ...
- 使用MapReduce实现二度人脉搜索算法
一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...
随机推荐
- js获取url中参数名也参数值
要撮利用js获取url中参数名也参数值这个不多见了,但我今天需要这样操作,下面我来给大家介绍一下具体的实例方法. 在已知参数名的情况下,获取参数值,使用正则表达式能很容易做到. js的实现方法如下 ...
- 杀死进程-LeetCode-582
英文版 582. Kill ProcessGiven n processes, each process has a unique PID (process id) and its PPID (par ...
- 润乾V4报表批量打印
背景说明 在应用中,经常遇到,批量打印的需求,批量打印,顾名思义,就是点击一次打印按钮,能打印多张报表. 下面,我们来介绍一下怎么样实现批量打印的 应用举例: Jsp代码 <% //rep ...
- Java设计模式----观察者模式详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Object、T(以下代指泛型)、?的区别
因为最近看了很多项目底层都使用了T,?泛型,于是百度了一下有如下理解 我们先来试着理解一下Object类,学习Java的应该都知道Object是所有类的父类,注意:那么这就意味着它的范围非常广!首先记 ...
- Oracle EBS 日记账
select b.status, h.je_source, (select USER_JE_CATEGORY_NAME from GL_JE_CATEGORIES where JE_CATEGORY_ ...
- ETL探索之旅
ETL(Ectract Transform Load) 抽取-转换-加载 ETL 商业软件: Informatica IBM DataStage Microsoft SSIS Oracle ODI ...
- 用Model来计算cell的高度
用Model来计算cell的高度 效果: 将计算cell高度的方法直接移植到Model当中,初始化的瞬间就计算好了高度,非常好用! 源码: Model // // Model.h // // Copy ...
- 使用CADisplayLink写秒表
使用CADisplayLink写秒表 效果: 源码: StopWatch.h 与 StopWatch.m // // StopWatch.h // ShowTime // // Created by ...
- QuickBI助你成为分析师-数据建模(二)
摘要: 数据集编辑功能界面介绍以及常见问题总结. 在数据集编辑界面可以进行数据建模来更好的展示数据,创建数据集默认将数值类型字段作为度量,日期.字符串等类型作为维度,度量可以根据维度分组展示.下面来介 ...