MapReduce实现共同好友(好友关系图实现—倚天屠龙记关系)

背景
如今大多数的社交网站都有提供的共同好友的服务,可以帮助与好友之间共享图片,消息,视频

博客的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的)
求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?

使用MapReduce对这个问题进行处理的时候可以通过两个MapReduce任务完成这个需求:

1、对原始数据进行反转解析,找出都有谁的好友里面有该用户;例如对于原始 A:B,C,D,F,E,O 数据,通过在map task中解析成 < B, A>< C, A>< D,A>< F,A>…的形式,这一系列的键值对表示所有代号为key值的用户,他的好友里面都有value值代表的用户。然后对这些键值对在reduce task中对key值相同的键值对(< A, B>< A, D>< A, F>…)进行拼接,拼接成< A B,D,F, …>的形式作为第一次MapReduce任务的输出。

上图为第一次MapReduce的输出,以其中的第一行数据(A F,D,O,I,H,B,K,G,C,)为例,这一行数据的含义是:F,D,O,I,H,B,K,G,C 这些用户的好友里面都有A。即分隔符后面的所有用户的好友里面都有分隔符前面的用户。

2、根据第一次MapReduce的输出结果,我们可以很容易的想到,只要把分隔符后面的用户两两任意组合,就可以得到这两个用户的一个共同好友。以第一行数据为例,拆分之后可以得到:< F-D , A>, < F-O , A>, < F-I , A> … < D-O , A>,< D-I , A> …然后我们再在reduce task中按照相同的key值对键值对进行拼接,就得到了整个数据集中任意两个用户之间的共同好友的列表。

输出格式:

A-B:C,E
(用户-用户:共同好友…)

需求分析
分为两个job
第一次输出结果,先求出A、B、C、….等是谁的好友
Job1:
Mapper:
keyin-valuein: (A:B,C,D,F,E,O)
map(): 将valuein拆分为若干好友,作为keyout写出
将keyin作为valueout
keyout-valueout: (友:用户)
(c:A),(C:B),(C:E)

Reducer:
keyin-valuein : (友:用户)
(c:A),(C:B),(C:E)
reduce():
keyout-valueout :(友:用户,用户,用户,用户)

A I,K,C,B,G,F,H,O,D,
B A,F,J,E,
C A,E,B,H,F,G,K,
D G,C,K,A,L,F,E,H,
E G,M,L,H,A,F,B,D,
F L,M,D,C,G,A,
G M,
H O,
I O,C,
J O,
K B,
L D,E,
M E,F,
O A,H,I,J,F,

第二次输出结果,输出每两个人的共同好友

Job2:
Mapper:
keyin-valuein: (友:用户,用户,用户,用户)
map(): 使用keyin作为valueout
将valuein切分后,两两拼接,作为keyout
keyout-valueout: (用户-用户,友)
(A-B,C),(A-B,E)
(A-E,C), (A-G,C), (A-F,C), (A-K,C)
(B-E,C ),(B-G,C)

 --------------------(B-E,C)(E-B,G)B-E: C,G

1
2
3
4
5
A-B E C
A-C D F
A-D E F
A-E D B C
A-F O B C D E
A-G F E C D
A-H E C D O
A-I O
A-J O B
A-K D C
A-L F E D
A-M E F
B-C A
B-D A E
B-E C
B-F E A C
B-G C E A
B-H A E C
B-I A
B-K C A
B-L E
B-M E
B-O A
C-D A F
C-E D
C-F D A
C-G D F A
C-H D A
C-I A
C-K A D
C-L D F
C-M F
C-O I A
D-E L
D-F A E
D-G E A F
D-H A E
D-I A
D-K A
D-L E F
D-M F E
D-O A
E-F D M C B
E-G C D
E-H C D
E-J B
E-K C D
E-L D
F-G D C A E
F-H A D O E C
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 D F E
G-M E F
G-O A
H-I O A
H-J O
H-K A C D
H-L D E
H-M E
H-O A
I-J O
I-K A
I-O A
K-L D
K-O A
L-M E F

Reducer:
keyin-valuein: (A-B,C),(A-B,E)
reduce():
keyout-valueout : (A-B:C,E)

由于上面的分析分析的是:英文字母; 比较麻烦:

二 . 通过倚天屠龙记人物关系来实现

1.原始数据:

2.代码实现:
package friends;

import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.File;
import java.io.IOException;

public class FriendsPublic {
//map
public static class MapTask extends Mapper<LongWritable, Text,Text, Text> {

    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//张三:李四,王五,赵丽,张无忌,灭绝师太,杨逍  ====>   李四-张三  王五-张三   赵丽-张三  .....String[] splits = value.toString().split(":");String values = splits[0];//再去切分另外一个数据   取到key值String[] friends = splits[1].split(",");//循环遍历  取到每一好友for (String friend : friends) {context.write(new Text(friend),new Text(values));}}
}//reduce
public static class ReduceTask extends Reducer<Text,Text,Text,Text> {@Override                 //B               (张三,李四,王五,赵丽.....)protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {//李四-张三  李四-王五  李四-赵丽 =====> 李四  张三,王五,赵丽,.....//booleanboolean flag=true;//需要一个字符串容器StringBuffer sb = new StringBuffer();for (Text value : values) {if(flag){sb.append(value);flag=false;}else{sb.append(",").append(value);}}//跳出for循环context.write(key,new Text(sb.toString()));}
}//main
public static void main(String[] args) throws Exception {//我们需要一盒hadoop的对象去提交这俩个内部类  Job    本地运行Configuration conf = new Configuration();Job job = Job.getInstance(conf);//提交那俩个内部类job.setMapperClass(FriendsPublic.MapTask.class);job.setReducerClass(FriendsPublic.ReduceTask.class);job.setJarByClass(FriendsPublic.class);//设置四个输出参数的类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);//如果输出文件  存在 就删除String output="E:\\BigData\\output\\friends1";File file = new File(output);if(file.exists()){FileUtils.deleteDirectory(file);}//设置输入  输出路径FileInputFormat.addInputPath(job,new Path("e:/friend.txt"));FileOutputFormat.setOutputPath(job,new Path(output));//温馨提示boolean b = job.waitForCompletion(true);System.out.println(b?"成功进行计算!!!":"哥们,出BUG了,赶快去调一下!!!");
}

}

3.结果:

注意:有的产生的结果中文乱码:

1.在处理输入文件的时候;修改他的编码格式: utf-8

17.大数据---MapReduce实现共同好友(好友关系图实现)相关推荐

  1. ma-云计算 大数据 mapreduce概念和关系

    0 云计算: 什么是云计算?针对这个问题,恐怕十个专家会给出十一个互不相同的答案,而事实上也有无数的文章从各个角度试图给出一个简单而确切的定义. 在最肤浅的级别上来说,原来基于web 2.0技术开发的 ...

  2. 大数据 MapReduce使用

    前言 简单讲讲我怎么在IDEA进行开发的. 大数据 基础概念 大数据 Centos基础 大数据 Shell基础 大数据 ZooKeeper 大数据 Hadoop介绍.配置与使用 大数据 Hadoop之 ...

  3. 大数据和区块链区别和关系

    大数据,需要应对海量化和快增长的存储,这要求底层硬件架构和文件系统在性价比上要大大高于传统技术,能够弹性扩张存储容量.谷歌的GFS和Hadoop的HDFS奠定了大数据存储技术的基础.另外,大数据对存储 ...

  4. 大数据关键技术、及计算模式介绍,以及大数据与云计算、物联网的关系

    大数据指数据与大数据技术这二者的综合,而大数据技术,是指伴随着大数据的采集.传输.处理和应用的相关技术,通过一系列非传统的工具来对大量的结构化.半结构化和非结构化数据进行处理,从而获得分析和预测结果的 ...

  5. 什么叫大数据,与云计算有何关系

    大数据(big data),是指无法在可承受的时间范围内用常规软件工具进行捕捉.管理和处理的数据集合. 大数据的4V特点:Volume(大量).Velocity(高速).Variety(多样).Val ...

  6. BigData:基于python编程—根据中国各个城市地理坐标+人口、GDP大数据进行标记中国地图、热点图、动态图

    BigData:基于python编程-根据中国各个城市地理坐标+人口.GDP大数据进行标记中国地图.热点图.动态图 目录 输出结果 1.地理坐标图 2.GDP热点图 3.人口热力图 输出结果 1.地理 ...

  7. 云计算、大数据和人工智能,他们的关系是如何的?

    云计算.大数据和人工智能,他们的关系是如何的? 今天跟大家讲讲云计算.大数据和人工智能.为什么讲这三个东西呢?因为这三个东西现在非常火,并且它们之间好像互相有关系:一般谈云计算的时候会提到大数据.谈人 ...

  8. 大数据技术和数据分析有什么关系

    大数据技术和数据分析有什么关系 大数据经过多年发展形成了一个完整的产业链和技术链,大数据的产业链是围绕技术链来打造的,而大数据的技术链则围绕数据价值化这个中心来展开,涉及到数据的采集.存储.安全.分析 ...

  9. 大数据和云计算和数据挖掘的关系?

    如题,大数据和云计算.数据挖掘的关系.从技术上看,大数据与云计算的关系就像一枚硬币的正反面一样密不可分.大数据必然无法用单台的计算机进行处理,必须采用分布式计算架构.它的特色在于对海量数据的挖掘,但它 ...

最新文章

  1. debugInit.c tomcat启动错误
  2. pygame (1) 移动小乌龟
  3. 有限元中单元节点和积分点的区别
  4. NIO--Buffer
  5. 揭秘任务型对话机器人(下篇)
  6. 素数回文数的个数(信息学奥赛一本通-T1408)
  7. hibernate 第二天
  8. 新年礼物 | 今天可以免费领取3980的Hadoop视频教程!
  9. java 并发编程实战代码_「Java并发编程实战」对象的组合
  10. ad18 bell封装_AD元件库中的常用元件和元器件封装资料合集
  11. Keysight WIFI6测试培训笔记
  12. 计算几何摸黑(2)-点和直线
  13. 读懂西瓜书 14 : 概率图模型
  14. iOS开发之制作越狱ios设备ipa包
  15. 2023 开工大吉!爆料各司年终奖
  16. FLV格式文件如何转换成MP4格式 1
  17. 马来西亚SIRIM认证
  18. 计算机键盘被锁怎么解,教你电脑键盘锁了要怎么解除
  19. 解决vscode打开中文乱码,用记事本打开却无乱码
  20. 关于HDMI2.1的一些常见问题答疑

热门文章

  1. 用友荣膺2022年度ICT产业生态服务最佳企业奖
  2. Java--JDK动态代理(AOP)
  3. Windows 安装,配置Tomcat
  4. 解决java编译错误:编码GBK的不可映射字符
  5. ZWeily的小品文(一)MFC中的文件读写问题
  6. Flink 滚动窗口、滑动窗口详解
  7. miniGUI编译详细过程以及示例
  8. 新垣结衣自拍照_仅使用代码创建自拍照
  9. gcc安装报错解决方法
  10. 怎么画流程图攻略:思维导图的绘制技巧详解