我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么利用Hadoop实现求共同好友

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么利用Hadoop实现求共同好友

这篇文章主要介绍怎么利用Hadoop实现求共同好友,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

前言

在很多社交APP中,比如大家熟悉的QQ好友列表中,打开会话框,经常可以看到下面有一栏共同好友的推荐列表,用户通过这种方式,可以添加潜在的关联好友

怎么利用Hadoop实现求共同好友

这种功能该如何实现呢?对redis比较了解的同学应该能很快想到,可以使用redis来实现这个功能。没错,redis确实是个不错的可以实现这个功能的方案。

但redis的实现有一定的局限性,因为redis存储和数据和计算时需要耗费较多的内存资源,设想一下,像腾讯QQ这样的规模,如果用这种方式做的话,估计Redis服务器的投入成本将是一笔不小的开销。

利用hadoop中的MapReduce同样可以实现这个功能,该如何实现呢?

业务分析

下面是原始的数据文件,第一栏可理解为本人,第二行为该用户的好友列表,以逗号分割,比如A用户的好友包括:B,C,D,F,E,O这几个,后面的行依次类推

A:B,C,D,F,E,O
B:A,C,E,K
C:F,A,D,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

现在的需求是:通过原始的数据文件,输出该文件中所有用户中哪些人两两之间存在共同好友并输出,格式如下:

A-B C,E
A-C    F,D
A-D    E,F
......

实现思路分析

步骤一:将原始数据拆分为如下格式

通过这一步,得到一组K/V,可以清晰的反映出一个用户的所有好友

B:A            #B是A的好友
C:A            #C是A的好友
D:A            #D是A的好友
F:A
E:A
O:A

A:B
C:B
E:B
K:B

F:C
A:C
D:C
I:C

B:E
C:E
D:E
M:E
L:E

步骤二、对第一步的数据进一步处理成如下格式

从第一步格式完毕后的数据,可以很明显看出并总结出一个规律,那就是左边那些用户的好友列表,以C用户为例,可以看出C这个用户有A,B,E三个好友,反过来讲,ABE这三个用户,他们有一个共同的好友A

其他的类推进行理解

C  A-B-E  #C是A和B和E的共同好友
D  A-C      #D是A和B的共同好友
A  B-C      #A是B和C的共同好友
B  A-E    #A是E和B的共同好友
......

步骤三、将步骤二中的数据调换位置

从步骤2中我们得知,C的好友有ABE,反过来说,ABE他们的共同好友有C,针对这种超过3个的,可以考虑下一步进行两两组合即可

A-B-E   C     #A、B、E有共同好友C
A-C     D     #A与C有共同好友D
B-C     A     #B与C有共同好友A
A-E     B     #A与E有共同好友B

步骤四、将步骤三得到的数据继续拆分

步骤三中,像 : A-B-E C 这种数据,显然需要进一步拆分,因为最终的结果是求取两两好友之间的共同好友,所以可以拆为: A-B C,A-E C,B-E C,为下一步数据组合做最后的准备

A-B  C
A-E  C
B-E  C
A-C  D
B-C  A
A-E  B
......

步骤五、将步骤四得到的数据合并

在使用MapReduce编程中我们知道,Map阶段出去的数据,进入reduce方法中的数据都是key相同的,以第四步中的: A-E 这个key为例,就有2个,这样通过 reduce方法最终输出的结果就是: A-E C,B ,即A-E 这两个用户的共同好友为 C和B

A-B  C        #A,B共同好友有C
A-E  C,B      #A,E有共同好友 C,B
B-E  C        #B,E有共同好友 C
A-C  D        #A,C有共同好友 D
B-C  A        #B,C有共同好友 A
......

通过以上的数据分析,最终可以达到预期的效果,同时也可以看出,上面的步骤划分到MapRedcue中,显然一个MapReduce肯定是无法完成的,至少需要2个

下面是结合上面的步骤分析,得出需要两个MapReduce的数据流程图,参考这个图来协助我们分析编写代码逻辑做参考

怎么利用Hadoop实现求共同好友

编码实现

1、第一个map类

public class FirstMapper extends Mapper<LongWritable,Text,Text,Text> {    @Override    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {        String val = value.toString();        String[] split = val.split(":");        //A:B,C,D,F,E,O  拆分后,左边是原用户,右边是好友        String user = split[0];        String friends = split[1];        String[] friendLists = friends.split(",");        //Map1 输出的结果为 :                for(String str :friendLists ){            context.write(new Text(str),new Text(user));        }    }}

2、第一个Reduce类

public class FirstReducer extends Reducer<Text,Text,Text,Text> {    @Override    protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {        StringBuffer stringBuffer = new StringBuffer();        for (Text text : values){            stringBuffer.append(text).append("-");        }        //最终写出去的数据格式为: A-E B ......        context.write(new Text(stringBuffer.toString()),key);    }}

3、第一个Job类

public class FirstJob {    public static void main(String[] args) throws Exception {        //1、获取job        Configuration configuration = new Configuration();        Job job = Job.getInstance(configuration);        //2、设置jar路径        job.setJarByClass(FirstJob.class);        //3、关联mapper 和 Reducer        job.setMapperClass(FirstMapper.class);        job.setReducerClass(FirstReducer.class);        //4、设置 map输出的 key/val 的类型        job.setMapOutputKeyClass(Text.class);        job.setMapOutputValueClass(Text.class);        //5、设置最终输出的key / val 类型        job.setOutputKeyClass(Text.class);        job.setOutputValueClass(Text.class);        //6、设置最终的输出路径        String inputPath = "F:\\网盘\\csv\\friends.txt";        String outPath = "F:\\网盘\\csv\\friends1";        FileInputFormat.setInputPaths(job,new Path(inputPath));        FileOutputFormat.setOutputPath(job,new Path(outPath));        // 7 提交job        boolean result = job.waitForCompletion(true);        System.exit(result ? 0 : 1);    }}

运行上面的Job代码,然后打开运行完毕后的第一个阶段的文件,从内容格式上看,符合第一阶段的输出结果要求的, 即下面的这种数据格式

怎么利用Hadoop实现求共同好友

怎么利用Hadoop实现求共同好友

4、第二个map类

public class SecondMapper extends Mapper<LongWritable,Text,Text,Text> {    @Override    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {        // I-K-C-B-G-F-H-O-D-    A  阶段1的文件输出格式                //需要将左边的数据进行两两拆分,与V进行组合输出        String val = value.toString();        String[] split = val.split("\t");        String v2 = split[1];        String[] allUsers = split[0].split("-");        Arrays.sort(allUsers);        for(int i=0;i<allUsers.length-1;i++){            for(int j=i+1;j<allUsers.length;j++){                context.write(new Text(allUsers[i] + "-" + allUsers[j]),new Text(v2));            }        }    }}

5、第二个Reducer类

public class SecondReducer extends Reducer<Text,Text,Text,Text> {    @Override    protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {        //上一步输出的结果:                //只需要将相同的key的Val进行组合即可,即 : A-B C-D,A-E C-D        StringBuffer stringBuffer = new StringBuffer();        for (Text text :values ){            stringBuffer.append(text.toString()).append("-");        }        context.write(key,new Text(stringBuffer.toString()));    }}

6、第二个Job类

public class SecondJob {    public static void main(String[] args) throws Exception {        //1、获取job        Configuration configuration = new Configuration();        Job job = Job.getInstance(configuration);        //2、设置jar路径        job.setJarByClass(SecondJob.class);        //3、关联mapper 和 Reducer        job.setMapperClass(SecondMapper.class);        job.setReducerClass(SecondReducer.class);        //4、设置 map输出的 key/val 的类型        job.setMapOutputKeyClass(Text.class);        job.setMapOutputValueClass(Text.class);        //5、设置最终输出的key / val 类型        job.setOutputKeyClass(Text.class);        job.setOutputValueClass(Text.class);        //6、设置最终的输出路径        String inputPath = "F:\\网盘\\csv\\friends1\\part-r-00000";        String outPath = "F:\\网盘\\csv\\friends2";        FileInputFormat.setInputPaths(job,new Path(inputPath));        FileOutputFormat.setOutputPath(job,new Path(outPath));        // 7 提交job        boolean result = job.waitForCompletion(true);        System.exit(result ? 0 : 1);    }}

运行上面的Job代码,查看最终的输出结果,可以看到,也是符合我们预期的业务的

怎么利用Hadoop实现求共同好友

以上是“怎么利用Hadoop实现求共同好友”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么利用Hadoop实现求共同好友

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么利用Hadoop实现求共同好友

这篇文章主要介绍怎么利用Hadoop实现求共同好友,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在很多社交APP中,比如大家熟悉的QQ好友列表中,打开会话框,经常可以看到下面有一栏共同好友的推荐列表,用户通过这种
2023-06-26

Java中怎么利用多线程锁实现数据同步共享

Java中怎么利用多线程锁实现数据同步共享,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。大多数应用程序要求线程互相通信来同步它们的动作。在Java程序中最简单实现同步的方法就是
2023-06-17

怎么利用vps实现文件共享

要利用VPS实现文件共享,可以按照以下步骤进行操作:1. 首先,要确保你已经购买了一个VPS,并且已经成功连接到VPS的操作系统上。2. 在VPS上安装一个文件共享服务,比如Samba。Samba是一个开源的文件共享服务,可以让Window
2023-09-14

怎么使用Vue实现添加好友功能

这篇文章主要介绍了怎么使用Vue实现添加好友功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Vue实现添加好友功能文章都会有所收获,下面我们一起来看看吧。一、前置知识在开始介绍添加好友功能之前,我们需
2023-07-06

利用hadoop怎么实现一个文件上传功能

本篇文章给大家分享的是有关利用hadoop怎么实现一个文件上传功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。hdfs上的文件是手动执行命令从本地linux上传至hdfs的。
2023-05-31

Filter怎么利用http请求实现绕过

Filter怎么利用http请求实现绕过?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。http请求绕过Filter的实例场景:两个web服务器,A当做服务端,B
2023-05-31

怎么在Spring Boot中利用Redis实现session共享

本篇文章给大家分享的是有关怎么在Spring Boot中利用Redis实现session共享,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入spring-boot-start
2023-05-30

怎么在c#中利用结构体实现共用体

怎么在c#中利用结构体实现共用体?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。理解 C 语言的共用体在 C 语言中,共用体是一种特殊的数据类型,允许你使用相同的一段内存空间存储
2023-06-14

利用Java怎么实现一个同步函数

本篇文章为大家展示了利用Java怎么实现一个同步函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。具体方法如下://同步
2023-05-31

Java 中怎么利用Thread实现读写同步

Java 中怎么利用Thread实现读写同步,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.读写者同步问题多个读者可以同时读取同一个缓冲区,但当有写者对缓冲区进行写操作时,具
2023-06-03

Ubuntu中怎么利用路由实现网络共享功能

Ubuntu中怎么利用路由实现网络共享功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. Ubuntu路由实现2. Mac OS X 10.6 共享上网3. rout
2023-06-16

Java中的跨域请求怎么利用CORS实现

这期内容当中小编将会给大家带来有关Java中的跨域请求怎么利用CORS实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用前后端分离模式开发项目时,往往会遇到这样一个问题 -- 无法跨域获取服务端数据这
2023-05-31

Java中怎么利用Synchronized实现多线程同步

这期内容当中小编将会给大家带来有关Java中怎么利用Synchronized实现多线程同步,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用同步的原因1. 在系统中对访类要使用多线程进行访问;2. 在该类
2023-06-17

Android中怎么利用同步锁实现多线程

Android中怎么利用同步锁实现多线程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、同步机制关键字synchronized 对于Java来说,最常用的同步机制就是sync
2023-05-30

Java中的跨域请求怎么利用Ajax jsonp 实现

这篇文章将为大家详细讲解有关Java中的跨域请求怎么利用Ajax jsonp 实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、什么是JSONP一般来说位于 server1.exampl
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录