1.社交粉丝数据分析:

  1. 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的)
  2. A:B,C,D,F,E,O
  3. B:A,C,E,K
  4. C:F,A,D,I
  5. D:A,E,F,L
  6. E:B,C,D,M,L
  7. F:A,B,C,D,E,O,M
  8. G:A,C,D,E,F
  9. H:A,C,D,E,O
  10. I:A,O
  11. J:B,O
  12. K:A,C,D
  13. L:D,E,F
  14. M:E,F,G
  15. O:A,H,I,J
  16. 求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?

解题思路:如果想要得到两两之间的共同好友,若A和B的共同好友是C,通过反向思考,可以求出C是哪些人的共同好友,然后将这些共同好友

      两两组合;

  1. c --> a b e f g h k (第一步:找出c的所有共同好友)
  2. a-b c
  3. a-e c (第二步:作为key,即可得到a-e的共同好友cd
  4.  
  5. d --> a c e f g h k
  6. a-c d
  7. a-e d

第一步代码实现:

  1. package cn.bigdata.hdfs.fensi;
  2. import java.io.IOException;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.fs.Path;
  5. import org.apache.hadoop.io.LongWritable;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Job;
  8. import org.apache.hadoop.mapreduce.Mapper;
  9. import org.apache.hadoop.mapreduce.Reducer;
  10. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  11. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  12. public class SharedFriendsStepOne {
  13.  
  14. static class SharedFriendsStepOneMapper extends Mapper<LongWritable, Text, Text, Text>{
  15. @Override
  16. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  17. //A:B,C,D,F,E,O(找出具有共同好友的都是哪些人的)
  18. String line = value.toString();
  19. String[] person_friends = line.split(":");
  20. String person = person_friends[0];
  21. String feiends = person_friends[1];
  22.  
  23. for(String friend : feiends.split(",")){
  24. // 输出<好友,人>
  25. context.write(new Text(friend), new Text(person));
  26. }
  27. }
  28. }
  29.  
  30. static class SharedFriendsStepOneReducer extends Reducer<Text, Text, Text, Text>{
  31. @Override
  32. protected void reduce(Text friend, Iterable<Text> persons, Context context) throws IOException, InterruptedException {
  33. //persons:具有共同好友的所有人:c --> a b e f g h k
  34. StringBuffer sb = new StringBuffer();
  35. for(Text person : persons){
  36. sb.append(person).append(",");
  37. }
  38. context.write(friend, new Text(sb.toString()));
  39. }
  40. }
  41.  
  42. public static void main(String[] args) throws Exception {
  43. Configuration conf = new Configuration();
  44.  
  45. Job job = Job.getInstance(conf);
  46. job.setJarByClass(SharedFriendsStepOne.class);
  47.  
  48. job.setOutputKeyClass(Text.class);
  49. job.setOutputValueClass(Text.class);
  50.  
  51. job.setMapperClass(SharedFriendsStepOneMapper.class);
  52. job.setReducerClass(SharedFriendsStepOneReducer.class);
  53.  
  54. FileInputFormat.setInputPaths(job, new Path(args[0]));
  55. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  56.  
  57. job.waitForCompletion(true);
  58. }
  59. }

运行结果:

  1. A I,K,C,B,G,F,H,O,D,
  2. B A,F,J,E,
  3. C A,E,B,H,F,G,K,
  4. D G,C,K,A,L,F,E,H,
  5. E G,M,L,H,A,F,B,D,
  6. F L,M,D,C,G,A,
  7. G M,
  8. H O,
  9. I O,C,
  10. J O,
  11. K B,
  12. L D,E,
  13. M E,F,
  14. O A,H,I,J,F,

第二步代码实现:具有共同好友的人两两作为key输出

  1. package cn.bigdata.hdfs.fensi;
  2. import java.io.IOException;
  3. import java.util.Arrays;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.LongWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.Mapper;
  10. import org.apache.hadoop.mapreduce.Reducer;
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13.  
  14. public class SharedFriendsStepTwo {
  15.  
  16. static class SharedFriendsStepTwoMapper extends Mapper<LongWritable, Text, Text, Text> {
  17.  
  18. // 拿到的数据是上一个步骤的输出结果
  19. // A I,K,C,B,G,F,H,O,D,
  20. // 友 人,人,人
  21. @Override
  22. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  23.  
  24. String line = value.toString();
  25. String[] friend_persons = line.split("\t");
  26.  
  27. String friend = friend_persons[0];
  28. String[] persons = friend_persons[1].split(",");
  29. //排序,使得B-C和C-B不重复
  30. Arrays.sort(persons);
  31.  
  32. for (int i = 0; i < persons.length - 1; i++) {
  33. for (int j = i + 1; j < persons.length; j++) {
  34. // 发出 <人-人,好友> ,这样,相同的“人-人”对的所有好友就会到同1个reduce中去
  35. context.write(new Text(persons[i] + "-" + persons[j]), new Text(friend));
  36. }
  37. }
  38. }
  39. }
  40.  
  41. static class SharedFriendsStepTwoReducer extends Reducer<Text, Text, Text, Text> {
  42.  
  43. @Override
  44. protected void reduce(Text person_person, Iterable<Text> friends, Context context) throws IOException, InterruptedException {
  45.  
  46. StringBuffer sb = new StringBuffer();
  47.  
  48. for (Text friend : friends) {
  49. sb.append(friend).append(" ");
  50.  
  51. }
  52. context.write(person_person, new Text(sb.toString()));
  53. }
  54. }
  55.  
  56. public static void main(String[] args) throws Exception {
  57.  
  58. Configuration conf = new Configuration();
  59. Job job = Job.getInstance(conf);
  60. job.setJarByClass(SharedFriendsStepTwo.class);
  61.  
  62. job.setOutputKeyClass(Text.class);
  63. job.setOutputValueClass(Text.class);
  64.  
  65. job.setMapperClass(SharedFriendsStepTwoMapper.class);
  66. job.setReducerClass(SharedFriendsStepTwoReducer.class);
  67.  
  68. FileInputFormat.setInputPaths(job, new Path("F:/fensiOutput/part-r-00000"));
  69. FileOutputFormat.setOutputPath(job, new Path("F:/fensiOutput4"));
  70. job.waitForCompletion(true);
  71. }
  72. }

运行结果:

  1. A-B E C
  2. A-C D F
  3. A-D E F
  4. A-E D B C
  5. A-F O B C D E
  6. A-G F E C D
  7. A-H E C D O
  8. A-I O
  9. A-J O B
  10. A-K D C
  11. A-L F E D
  12. A-M E F
  13. B-C A
  14. B-D A E
  15. B-E C
  16. B-F E A C
  17. B-G C E A
  18. B-H A E C
  19. B-I A
  20. B-K C A
  21. B-L E
  22. B-M E
  23. B-O A
  24. C-D A F
  25. C-E D
  26. C-F D A
  27. C-G D F A
  28. C-H D A
  29. C-I A
  30. C-K A D
  31. C-L D F
  32. C-M F
  33. C-O I A
  34. D-E L
  35. D-F A E
  36. D-G E A F
  37. D-H A E
  38. D-I A
  39. D-K A
  40. D-L E F
  41. D-M F E
  42. D-O A
  43. E-F D M C B
  44. E-G C D
  45. E-H C D
  46. E-J B
  47. E-K C D
  48. E-L D
  49. F-G D C A E
  50. F-H A D O E C
  51. F-I O A
  52. F-J B O
  53. F-K D C A
  54. F-L E D
  55. F-M E
  56. F-O A
  57. G-H D C E A
  58. G-I A
  59. G-K D A C
  60. G-L D F E
  61. G-M E F
  62. G-O A
  63. H-I O A
  64. H-J O
  65. H-K A C D
  66. H-L D E
  67. H-M E
  68. H-O A
  69. I-J O
  70. I-K A
  71. I-O A
  72. K-L D
  73. K-O A
  74. L-M E F

Hadoop_24_MapReduce实现QQ共同好友的更多相关文章

  1. qq加好友加群限制ip怎么解决

    目前各样格式的推广都会用到腾讯QQ,现在就遇到了问题.QQ加好友加群,经常会提示你的账号存在不安全因素,暂停加好友功能.这个原因都是本地同一个IP,登陆的QQ过多,加好友过多.导致这个IP被记录,相当 ...

  2. web qq 获取好友列表hash算法

    web qq 获取好友列表hash算法 在使用web qq的接口进行好友列表获取的时候,需要post一个参数:hash 在对其js文件进行分析之后,发现计算hash的函数位于: http://0.we ...

  3. Python爬虫实战:使用Selenium抓取QQ空间好友说说

    前面我们接触到的,都是使用requests+BeautifulSoup组合对静态网页进行请求和数据解析,若是JS生成的内容,也介绍了通过寻找API借口来获取数据. 但是有的时候,网页数据由JS生成,A ...

  4. 复制本贴地址传给QQ/MSN好友的代码

    <input name="" onclick='copyToClipBoard()' type="button" value=" 复制本贴地址, ...

  5. QQ自动发送+@好友功能+tencent://功能

    1.取出全部标题 D2007版本 procedure TForm1.Button1Click(Sender: TObject);var  hCurrentWindow:HWnd;  szText: a ...

  6. XMPP通讯开发-仿QQ显示好友列表和用户组

    在 XMPP通讯开发-服务器好友获取以及监听状态变化   中我们获取服务器上的用户好友信息,然后结合XMPP通讯开发-好友获取界面设计    我们将两个合并起来,首先获取用户组,然后把用户组用List ...

  7. qq面板/ 好友列表

    效果如下:依次为图一---图二----图三----图四 主要实现效果: 点击主标题显示下拉好友,再点击收起下拉好友:鼠标移到好友上背景颜色改变:选中的好友背景颜色也要改变: 代码如下: <!DO ...

  8. 无需QQ成为好友,直接启动QQ客户端聊天

    <a style="color:#fff; margin-left:8px; padding-top:12px;" target="_parent" hr ...

  9. iOS实现类似QQ的好友列表,自由展开折叠(在原来TableView的基础上添加一个字典,一个Button)

    //直接代码 只包含 折叠展开字典的处理搭建#import "CFViewController.h" @interface CFViewController ()<UITab ...

随机推荐

  1. 知识点整理-网络IO知识总结

    UNIX 系统下的 I/O 模型有 5 种 同步阻塞 I/O.同步非阻塞 I/O.I/O 多路复用.信号驱动 I/O 和异步 I/O 什么是I/O 所谓的I/O 就是计算机内存与外部设备之间拷贝数据的 ...

  2. Flutter安卓客户端打包

    想要安装到手机上,必须要进行打包,因为没有苹果手机,所以只能打包Android客户端的apk. 检查 App的配置 查看默认应用程序清单文件(位于/android/app/src/main/中的And ...

  3. Leetcode 69. Sqrt(x)及其扩展(有/无精度、二分法、牛顿法)详解

    Leetcode 69. Sqrt(x) Easy https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute an ...

  4. 【转】TCP/IP网络协议各层首部

    ​ 数据包封装流程(逐层封装,逐层解封) 二层帧(二层帧中目的地址6个字节,源地址6个字节,长度/类型2个字节,二层帧共18个字节) ip头部(ip头部20字节) tcp头部(tcp头部20个字节): ...

  5. vue-cli 3.x搭建项目以及其中vue.config.js文件的配置

    参考链接:https://www.cnblogs.com/wxh0929/p/11271551.html vue-cli3全面配置详解:https://www.jb51.net/article/150 ...

  6. webpack4实例

    webpack现在已经成为前端很多的打包器.网上关于webpack的相关文章也是很多,本文主要是根据自己的学习步骤来记录的,进行简单的webpack实例的讲解. 注意:一定要确定安装的node.js的 ...

  7. information retrieval (CMU 11642)

    1. Heap's law. predict the number of new vocabulary. 参考:https://www.youtube.com/watch?v=JDp12gU-vEQ ...

  8. 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用

    资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...

  9. 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 ...

  10. Redis 学习笔记(篇五):对象(RedisObject)

    Redis-对象 在以前的文章中,我们介绍了 Redis 用到的主要数据结构,比如简单动态字符串.双端链表.字典.压缩列表.整数集合. 然而 Redis 并没有直接使用这些数据结构来实现键值对的数据库 ...