需求案例:求共同好友
以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友
关系是单向的)
A:B,C,D,F,E,O
B:A,C,E,K
C:A,B,D,E,I
D:A,E,F,L
E:B,C,D,M,L
F:A,B,C,D,E,O,M
G:A,C,D,E,F
H:A,C,D,E,O
I:A,O
J:B,O
K:A,C,D
L:D,E,F
M:E,F,G
O:A,H,I,J
求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?
package com.hadoop.common_friends_step1;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class Step1Mapper extends Mapper<LongWritable, Text,Text,Text> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 1. 以: 拆分数据 冒号左边就是 K2String[] split = value.toString().split(":");String userStr = split[0];// 2. 将冒号右边的字符串以逗号拆分,每个成员就是K2String[] split1 = split[1].split(",");for (String s : split1) {// 3. 将k2 V2 写入上下文中context.write(new Text(s),new Text(userStr));}}
}
package com.hadoop.common_friends_step1;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class Step1Reducer extends Reducer<Text,Text,Text,Text> {@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {StringBuffer stringBuffer = new StringBuffer();// 1. 遍历集合 并将每个元素拼接 得到K3for (Text value : values) {stringBuffer.append(value.toString()).append("-");}// 2. K2 就是 V3// 3. 将K3 和V3 写到上下文中context.write(new Text(stringBuffer.toString()),new Text(key));}}
package com.hadoop.common_friends_step1;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;public class Step1Main extends Configured implements Tool {@Overridepublic int run(String[] strings) throws Exception {//1. 获取job对象Job job = Job.getInstance(super.getConf(), "map_reduce_step1");// 2. 设置job任务// 第一步: 设置输入类 和输入路径job.setInputFormatClass(TextInputFormat.class);TextInputFormat.addInputPath(job,new Path("file:///E:\\input\\friends_step_input"));// 第二步: 设置Mapper类和数据类型job.setMapperClass(Step1Mapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);// 第三、四、五、六// 第七步: 设置Reduce 类和类型job.setReducerClass(Step1Reducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);// 设置输出类 和输出路径job.setOutputFormatClass(TextOutputFormat.class);TextOutputFormat.setOutputPath(job,new Path("file:///E:\\out\\friends_step_out"));// 3. 等待任务结束boolean b = job.waitForCompletion(true);return b ? 0 : 1;}public static void main(String[] args) throws Exception {Configuration configuration = new Configuration();int run = ToolRunner.run(configuration, new Step1Main(), args);System.exit(run);}}
package com.hadoop.common_friends_step2;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;
import java.util.Arrays;public class Step2Mapper extends Mapper<LongWritable, Text,Text,Text> {/***** k1 V10 I-K-B-G-F-H-O-C-D- Ak2 V2I-K AI-B A**/@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 1. 拆分行文本数据 结果的第二部分可以得到 V2String[] split = value.toString().split("\t");String friendsStr = split[1];// 2. 继续 以 ‘-’ 为分隔符拆分行文本数据第一部分,得到数组String[] userArray = split[0].split("-");//3. 对数组做一个排序Arrays.sort(userArray);//4. 对数组中的元素 进行两两组合 ,得到 K2/***A-E-C ---------> A C E****/for (int i = 0; i < userArray.length; i++) {for (int j = i+1 ; j < userArray.length; j++) {// 5.将 K2 和 V2 写入上下文中context.write(new Text(userArray[i]+ "-"+ userArray[j]),new Text(friendsStr));}}}
}
package com.hadoop.common_friends_step2;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class Step2Reduce extends Reducer<Text,Text,Text,Text> {@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {// 1. 原来的K2 就是 K3//2. 将集合进行遍历,将集合中的元素拼接 , 得到 V3StringBuffer buffer = new StringBuffer();for (Text value : values) {buffer.append(value.toString()).append("-");}// 3. 将 K3 和 V3 写入 上下文中context.write(key,new Text(buffer.toString()));}
}
package com.hadoop.common_friends_step2;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;public class Step2Main extends Configured implements Tool {@Overridepublic int run(String[] strings) throws Exception {// 1. 获取job对象Job job = Job.getInstance(super.getConf(), "friends_step2");// 2. 设置job任务// 第一步: 设置输入类和输入路径job.setInputFormatClass(TextInputFormat.class);TextInputFormat.addInputPath(job,new Path("file:///E:\\out\\friends_step_out"));// 第二步: 设置Mapper 类和 数据类型job.setMapperClass(Step2Mapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);// 第三 四 五 六// 第七步: 设置Reduce 类和类型job.setReducerClass(Step2Reduce.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);// 设置输出类 和输出路劲job.setOutputFormatClass(TextOutputFormat.class);TextOutputFormat.setOutputPath(job,new Path("file:///E:\\out\\friends_step2_out"));//3. 等待任务结束boolean b = job.waitForCompletion(true);return b ? 0 : 1;}public static void main(String[] args) throws Exception {Configuration configuration = new Configuration();int run = ToolRunner.run(configuration, new Step2Main(), args);System.exit(run);}}
将第一次的结果,作为第二次的处理数据,经过两次处理得出结果:
A-B C-E-
A-C B-E-D-
A-D F-E-
A-E B-D-C-
A-F O-E-D-B-C-
A-G C-F-D-E-
A-H O-D-C-E-
A-I O-
A-J B-O-
A-K C-D-
A-L D-E-F-
A-M E-F-
B-C A-E-
B-D E-A-
B-E C-
B-F E-C-A-
B-G E-A-C-
B-H C-A-E-
B-I A-
B-K C-A-
B-L E-
B-M E-
B-O A-
C-D E-A-
C-E D-B-
C-F E-B-A-D-
C-G D-E-A-
C-H A-E-D-
C-I A-
C-J B-
C-K A-D-
C-L D-E-
C-M E-
C-O A-I-
D-E L-
D-F A-E-
D-G E-F-A-
D-H E-A-
D-I A-
D-K A-
D-L E-F-
D-M F-E-
D-O A-
E-F M-C-D-B-
E-G D-C-
E-H C-D-
E-J B-
E-K C-D-
E-L D-
F-G E-D-C-A-
F-H A-D-O-C-E-
F-I O-A-
F-J B-O-
F-K D-C-A-
F-L E-D-
F-M E-
F-O A-
G-H D-C-E-A-
G-I A-
G-K D-A-C-
G-L F-D-E-
G-M E-F-
G-O A-
H-I A-O-
H-J O-
H-K A-D-C-
H-L E-D-
H-M E-
H-O A-
I-J O-
I-K A-
I-O A-
K-L D-
K-O A-
L-M F-E-
需求案例:求共同好友相关推荐
- 【大数据day14】——MapReduce的运行机制详解(案列:Reduce 端实现 JOIN, Map端实现 JOIN,求共同好友)
文章目录 1 .MapReduce的运行机制详解 1.1:MapTask 工作机制 详细步骤 配置 1.2 :ReduceTask 工作机制 详细步骤 1.3:Shuffle 过程 2. 案例: Re ...
- 需求与商业模式创新-需求2-需求基础
Book2-需求基础 1. 需求的定义(IEEE) (用户的观点)用户为了解决问题或达到某些目标所需要的条件或能力. (开发者的观点)系统或系统部件为了满足合同.标准.规范或者其他正式文档所规定的要求 ...
- hadoop-小案例实现qq好友推荐
一.本文主要是hadoop hdfs文件系统和mapReduce离线计算框架整合小案例 二.前提是读者已经部署了hadoop的namenode.datanode.secodaynamenode 三.分 ...
- hadoop3求共同好友
需求:求哪些人两两之间有共同的好友,及共同好友都有哪些人. 好友源数据 ------------------------------------ A:B,C,D,F,E,O B:A,C,E,K C:F ...
- 求共同好友和好友推荐系统
一.求共同好友 1.1 需求及分析 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的) A:B,C,D,F,E,O B:A,C,E,K C:A,B,D,E ...
- spark求共同好友
使用spark求共同好友: 在做一些项目时,又时可能遇到一些类似与求共同好友的要求,可以根据共同好友进行推荐添加好友,就比如说A和B的好友有M,K,O,L,那么有可能A和B就是也认识,所以可以把B推荐 ...
- 使用hive求共同好友
一个mapreduce的经典题目--求共同好友,目前网上还没有人用hive实现,我来用hive算一下. 一.数据准备 create table friends(people string,friend ...
- hadoop求共同好友案例
4.1 需求分析 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的) A:B,C,D,F,E,O B:A,C,E,K C:A,B,D,E,I D:A,E, ...
- 需求与商业模式创新-需求3-需求工程过程
Book3-需求工程过程 1. 需求工程过程 过程是一组相关活动的集成,通过这些活动的执行,可以完成一项任务或者达到一个目标. 需求工程过程是系统开发当中需求开发活动的集成,他以用户所面临的业务问题为 ...
最新文章
- asp.net 学习笔记 代码块标记
- 干货一:通过自定义PopupWindow实现QQ菜单选项功能
- 在安装one_gadget遇到 one_gadget requires Ruby version >= 2.4. 的问题解决
- helm部署hadoop报错解决方法
- 二进制编译安装mysql_MariaDB通用二进制编译安装详解
- Centos7 安装Go环境
- 关于 VB,VC,Delphi,SDK 的笑话
- 科技公司如何占据了你的每一分钟?
- 生成对抗网络系列—CycleGAN
- VS提示error C2011: “timespec”:“struct”类型重定义
- 软考 系统分析师教程 免费拿走不谢
- Access宏学习总结
- pyspark中where条件使用,单一匹配及多条件匹配
- 操作系统安装磁盘清理方法
- 什么叫断章取义,什么叫曲解
- ValueError: Cannot have number of splits n_splits=10 greater than the number of samples: n_samples=0
- java个十百千万位余数_1 Java第三课[流程控制]
- Android UI 之WaterFall瀑布流效果
- Ansible Play book 实现网络自动化
- J4125小主机部署软路由笔记01
热门文章
- UEFI启动模式下win10+Ubuntu18.04双硬盘(固态+机械)双系统安装2019.06船新版本
- 浅谈路由器的路由功能
- 苹果8P/ iphone8plus /iphone8p已经连接WIFI 但是无法上网的问题
- 移动端和PC端的录屏软件汇总,需要的朋友速看
- 1-Volcano火山:容器与批量计算的碰撞
- 摸头杀,忍の摸头之术html单页源码
- 计算机鼠标怎么设置在哪里,电脑鼠标灵敏度怎么调,在哪里调?这份设置教程收好了非常简单(各系统通用)...
- MATLAB截取图像特定区域
- python 从同花顺获取数据导出,通达信PYTHON读取本地数据,如何使用python在文件中读取数据?...
- Idea一键自动导包设置--导入类中所有包