以下是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-

需求案例:求共同好友相关推荐

  1. 【大数据day14】——MapReduce的运行机制详解(案列:Reduce 端实现 JOIN, Map端实现 JOIN,求共同好友)

    文章目录 1 .MapReduce的运行机制详解 1.1:MapTask 工作机制 详细步骤 配置 1.2 :ReduceTask 工作机制 详细步骤 1.3:Shuffle 过程 2. 案例: Re ...

  2. 需求与商业模式创新-需求2-需求基础

    Book2-需求基础 1. 需求的定义(IEEE) (用户的观点)用户为了解决问题或达到某些目标所需要的条件或能力. (开发者的观点)系统或系统部件为了满足合同.标准.规范或者其他正式文档所规定的要求 ...

  3. hadoop-小案例实现qq好友推荐

    一.本文主要是hadoop hdfs文件系统和mapReduce离线计算框架整合小案例 二.前提是读者已经部署了hadoop的namenode.datanode.secodaynamenode 三.分 ...

  4. hadoop3求共同好友

    需求:求哪些人两两之间有共同的好友,及共同好友都有哪些人. 好友源数据 ------------------------------------ A:B,C,D,F,E,O B:A,C,E,K C:F ...

  5. 求共同好友和好友推荐系统

    一.求共同好友 1.1 需求及分析 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的) A:B,C,D,F,E,O B:A,C,E,K C:A,B,D,E ...

  6. spark求共同好友

    使用spark求共同好友: 在做一些项目时,又时可能遇到一些类似与求共同好友的要求,可以根据共同好友进行推荐添加好友,就比如说A和B的好友有M,K,O,L,那么有可能A和B就是也认识,所以可以把B推荐 ...

  7. 使用hive求共同好友

    一个mapreduce的经典题目--求共同好友,目前网上还没有人用hive实现,我来用hive算一下. 一.数据准备 create table friends(people string,friend ...

  8. 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, ...

  9. 需求与商业模式创新-需求3-需求工程过程

    Book3-需求工程过程 1. 需求工程过程 过程是一组相关活动的集成,通过这些活动的执行,可以完成一项任务或者达到一个目标. 需求工程过程是系统开发当中需求开发活动的集成,他以用户所面临的业务问题为 ...

最新文章

  1. asp.net 学习笔记 代码块标记
  2. 干货一:通过自定义PopupWindow实现QQ菜单选项功能
  3. 在安装one_gadget遇到 one_gadget requires Ruby version >= 2.4. 的问题解决
  4. helm部署hadoop报错解决方法
  5. 二进制编译安装mysql_MariaDB通用二进制编译安装详解
  6. Centos7 安装Go环境
  7. 关于 VB,VC,Delphi,SDK 的笑话
  8. 科技公司如何占据了你的每一分钟?
  9. 生成对抗网络系列—CycleGAN
  10. VS提示error C2011: “timespec”:“struct”类型重定义
  11. 软考 系统分析师教程 免费拿走不谢
  12. Access宏学习总结
  13. pyspark中where条件使用,单一匹配及多条件匹配
  14. 操作系统安装磁盘清理方法
  15. 什么叫断章取义,什么叫曲解
  16. ValueError: Cannot have number of splits n_splits=10 greater than the number of samples: n_samples=0
  17. java个十百千万位余数_1 Java第三课[流程控制]
  18. Android UI 之WaterFall瀑布流效果
  19. Ansible Play book 实现网络自动化
  20. J4125小主机部署软路由笔记01

热门文章

  1. UEFI启动模式下win10+Ubuntu18.04双硬盘(固态+机械)双系统安装2019.06船新版本
  2. 浅谈路由器的路由功能
  3. 苹果8P/ iphone8plus /iphone8p已经连接WIFI 但是无法上网的问题
  4. 移动端和PC端的录屏软件汇总,需要的朋友速看
  5. 1-Volcano火山:容器与批量计算的碰撞
  6. 摸头杀,忍の摸头之术html单页源码
  7. 计算机鼠标怎么设置在哪里,电脑鼠标灵敏度怎么调,在哪里调?这份设置教程收好了非常简单(各系统通用)...
  8. MATLAB截取图像特定区域
  9. python 从同花顺获取数据导出,通达信PYTHON读取本地数据,如何使用python在文件中读取数据?...
  10. Idea一键自动导包设置--导入类中所有包