Hadoop_24_MapReduce实现QQ共同好友
1.社交粉丝数据分析:
- 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的)
- 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,通过反向思考,可以求出C是哪些人的共同好友,然后将这些共同好友
两两组合;
- c --> a b e f g h k (第一步:找出c的所有共同好友)
- a-b c
- a-e c (第二步:作为key,即可得到a-e的共同好友c和d)
- d --> a c e f g h k
- a-c d
- a-e d
第一步代码实现:
- package cn.bigdata.hdfs.fensi;
- import java.io.IOException;
- 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;
- public class SharedFriendsStepOne {
- static class SharedFriendsStepOneMapper extends Mapper<LongWritable, Text, Text, Text>{
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- //A:B,C,D,F,E,O(找出具有共同好友的都是哪些人的)
- String line = value.toString();
- String[] person_friends = line.split(":");
- String person = person_friends[0];
- String feiends = person_friends[1];
- for(String friend : feiends.split(",")){
- // 输出<好友,人>
- context.write(new Text(friend), new Text(person));
- }
- }
- }
- static class SharedFriendsStepOneReducer extends Reducer<Text, Text, Text, Text>{
- @Override
- protected void reduce(Text friend, Iterable<Text> persons, Context context) throws IOException, InterruptedException {
- //persons:具有共同好友的所有人:c --> a b e f g h k
- StringBuffer sb = new StringBuffer();
- for(Text person : persons){
- sb.append(person).append(",");
- }
- context.write(friend, new Text(sb.toString()));
- }
- }
- public static void main(String[] args) throws Exception {
- Configuration conf = new Configuration();
- Job job = Job.getInstance(conf);
- job.setJarByClass(SharedFriendsStepOne.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(Text.class);
- job.setMapperClass(SharedFriendsStepOneMapper.class);
- job.setReducerClass(SharedFriendsStepOneReducer.class);
- FileInputFormat.setInputPaths(job, new Path(args[0]));
- FileOutputFormat.setOutputPath(job, new Path(args[1]));
- job.waitForCompletion(true);
- }
- }
运行结果:
- 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,
第二步代码实现:具有共同好友的人两两作为key输出
- package cn.bigdata.hdfs.fensi;
- import java.io.IOException;
- import java.util.Arrays;
- 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;
- public class SharedFriendsStepTwo {
- static class SharedFriendsStepTwoMapper extends Mapper<LongWritable, Text, Text, Text> {
- // 拿到的数据是上一个步骤的输出结果
- // A I,K,C,B,G,F,H,O,D,
- // 友 人,人,人
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- String line = value.toString();
- String[] friend_persons = line.split("\t");
- String friend = friend_persons[0];
- String[] persons = friend_persons[1].split(",");
- //排序,使得B-C和C-B不重复
- Arrays.sort(persons);
- for (int i = 0; i < persons.length - 1; i++) {
- for (int j = i + 1; j < persons.length; j++) {
- // 发出 <人-人,好友> ,这样,相同的“人-人”对的所有好友就会到同1个reduce中去
- context.write(new Text(persons[i] + "-" + persons[j]), new Text(friend));
- }
- }
- }
- }
- static class SharedFriendsStepTwoReducer extends Reducer<Text, Text, Text, Text> {
- @Override
- protected void reduce(Text person_person, Iterable<Text> friends, Context context) throws IOException, InterruptedException {
- StringBuffer sb = new StringBuffer();
- for (Text friend : friends) {
- sb.append(friend).append(" ");
- }
- context.write(person_person, new Text(sb.toString()));
- }
- }
- public static void main(String[] args) throws Exception {
- Configuration conf = new Configuration();
- Job job = Job.getInstance(conf);
- job.setJarByClass(SharedFriendsStepTwo.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(Text.class);
- job.setMapperClass(SharedFriendsStepTwoMapper.class);
- job.setReducerClass(SharedFriendsStepTwoReducer.class);
- FileInputFormat.setInputPaths(job, new Path("F:/fensiOutput/part-r-00000"));
- FileOutputFormat.setOutputPath(job, new Path("F:/fensiOutput4"));
- job.waitForCompletion(true);
- }
- }
运行结果:
- 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
Hadoop_24_MapReduce实现QQ共同好友的更多相关文章
- qq加好友加群限制ip怎么解决
目前各样格式的推广都会用到腾讯QQ,现在就遇到了问题.QQ加好友加群,经常会提示你的账号存在不安全因素,暂停加好友功能.这个原因都是本地同一个IP,登陆的QQ过多,加好友过多.导致这个IP被记录,相当 ...
- web qq 获取好友列表hash算法
web qq 获取好友列表hash算法 在使用web qq的接口进行好友列表获取的时候,需要post一个参数:hash 在对其js文件进行分析之后,发现计算hash的函数位于: http://0.we ...
- Python爬虫实战:使用Selenium抓取QQ空间好友说说
前面我们接触到的,都是使用requests+BeautifulSoup组合对静态网页进行请求和数据解析,若是JS生成的内容,也介绍了通过寻找API借口来获取数据. 但是有的时候,网页数据由JS生成,A ...
- 复制本贴地址传给QQ/MSN好友的代码
<input name="" onclick='copyToClipBoard()' type="button" value=" 复制本贴地址, ...
- QQ自动发送+@好友功能+tencent://功能
1.取出全部标题 D2007版本 procedure TForm1.Button1Click(Sender: TObject);var hCurrentWindow:HWnd; szText: a ...
- XMPP通讯开发-仿QQ显示好友列表和用户组
在 XMPP通讯开发-服务器好友获取以及监听状态变化 中我们获取服务器上的用户好友信息,然后结合XMPP通讯开发-好友获取界面设计 我们将两个合并起来,首先获取用户组,然后把用户组用List ...
- qq面板/ 好友列表
效果如下:依次为图一---图二----图三----图四 主要实现效果: 点击主标题显示下拉好友,再点击收起下拉好友:鼠标移到好友上背景颜色改变:选中的好友背景颜色也要改变: 代码如下: <!DO ...
- 无需QQ成为好友,直接启动QQ客户端聊天
<a style="color:#fff; margin-left:8px; padding-top:12px;" target="_parent" hr ...
- iOS实现类似QQ的好友列表,自由展开折叠(在原来TableView的基础上添加一个字典,一个Button)
//直接代码 只包含 折叠展开字典的处理搭建#import "CFViewController.h" @interface CFViewController ()<UITab ...
随机推荐
- 知识点整理-网络IO知识总结
UNIX 系统下的 I/O 模型有 5 种 同步阻塞 I/O.同步非阻塞 I/O.I/O 多路复用.信号驱动 I/O 和异步 I/O 什么是I/O 所谓的I/O 就是计算机内存与外部设备之间拷贝数据的 ...
- Flutter安卓客户端打包
想要安装到手机上,必须要进行打包,因为没有苹果手机,所以只能打包Android客户端的apk. 检查 App的配置 查看默认应用程序清单文件(位于/android/app/src/main/中的And ...
- Leetcode 69. Sqrt(x)及其扩展(有/无精度、二分法、牛顿法)详解
Leetcode 69. Sqrt(x) Easy https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute an ...
- 【转】TCP/IP网络协议各层首部
数据包封装流程(逐层封装,逐层解封) 二层帧(二层帧中目的地址6个字节,源地址6个字节,长度/类型2个字节,二层帧共18个字节) ip头部(ip头部20字节) tcp头部(tcp头部20个字节): ...
- vue-cli 3.x搭建项目以及其中vue.config.js文件的配置
参考链接:https://www.cnblogs.com/wxh0929/p/11271551.html vue-cli3全面配置详解:https://www.jb51.net/article/150 ...
- webpack4实例
webpack现在已经成为前端很多的打包器.网上关于webpack的相关文章也是很多,本文主要是根据自己的学习步骤来记录的,进行简单的webpack实例的讲解. 注意:一定要确定安装的node.js的 ...
- information retrieval (CMU 11642)
1. Heap's law. predict the number of new vocabulary. 参考:https://www.youtube.com/watch?v=JDp12gU-vEQ ...
- 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...
- python接口测试
引入unittest框架 get请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #coding: utf-8 import un ...
- Redis 学习笔记(篇五):对象(RedisObject)
Redis-对象 在以前的文章中,我们介绍了 Redis 用到的主要数据结构,比如简单动态字符串.双端链表.字典.压缩列表.整数集合. 然而 Redis 并没有直接使用这些数据结构来实现键值对的数据库 ...