MapReduce 社交粉丝数据分析


求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?

  • 用户及好友数据
  1. A:B,C,D,F,E,O
  2. B:A,C,E,K
  3. C:F,A,D,I
  4. D:A,E,F,L
  5. E:B,C,D,M,L
  6. F:A,B,C,D,E,O,M
  7. G:A,C,D,E,F
  8. H:A,C,D,E,O
  9. I:A,O
  10. J:B,O
  11. K:A,C,D
  12. L:D,E,F
  13. M:E,F,G
  14. O:A,H,I,J
  • java代码

需要两步完成需求

首先先创建第一步的package

在package中定义main、Mapper、Reducer三个类

定义一个Mapper类

  1. package cn.itcast.demo1.step1;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Mapper;
  5. import java.io.IOException;
  6. public class Step1Mapper extends Mapper<LongWritable, Text, Text, Text> {
  7. @Override
  8. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  9. //输入数据如下格式 A:B,C,D,E,O
  10. //将用户和好友列表分开
  11. String[] split = value.toString().split(":");
  12. //将好友列表分开,放到一个数组中去
  13. String[] friendList = split[1].split(",");
  14. //循环遍历,输出的k2,v2格式为 B [A,E]
  15. for (String friend : friendList) {
  16. context.write(new Text(friend), new Text(split[0]));
  17. }
  18. }
  19. }

定义一个Reducer类

  1. package cn.itcast.demo1.step1;
  2. import org.apache.hadoop.io.Text;
  3. import org.apache.hadoop.mapreduce.Reducer;
  4. import java.io.IOException;
  5. public class Step1Reducer extends Reducer<Text,Text,Text,Text> {
  6. /*
  7. reduce接收到数据是 B [A,E]
  8. B是好友,集合里面装的是多个用户
  9. 将数据最终转换成这样的形式进行输出 A-B-E-F-G-H-K- C
  10. */
  11. @Override
  12. protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  13. //创建StringBuffer对象
  14. StringBuffer sb = new StringBuffer();
  15. //循环遍历得到v2并拼接成字符串
  16. for (Text value : values) {
  17. sb.append(value.toString()).append("-");
  18. }
  19. context.write(new Text(sb.toString()),key);
  20. }
  21. }

程序main函数入口

  1. package cn.itcast.demo1.step1;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.conf.Configured;
  4. import org.apache.hadoop.fs.Path;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Job;
  7. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  8. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  9. import org.apache.hadoop.util.Tool;
  10. import org.apache.hadoop.util.ToolRunner;
  11. public class Step1Main extends Configured implements Tool {
  12. @Override
  13. public int run(String[] args) throws Exception {
  14. //创建job对象
  15. Job job = Job.getInstance(super.getConf(), "step1");
  16. //输入数据,设置输入路径
  17. job.setInputFormatClass(TextInputFormat.class);
  18. TextInputFormat.setInputPaths(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/5.大数据离线第五天/共同好友/input/friends.txt"));
  19. //自定义map逻辑
  20. job.setMapperClass(Step1Mapper.class);
  21. //设置k2,v2输出类型
  22. job.setMapOutputKeyClass(Text.class);
  23. job.setMapOutputValueClass(Text.class);
  24. //自定义reduce逻辑
  25. job.setReducerClass(Step1Reducer.class);
  26. //设置k3,v3输出类型
  27. job.setOutputKeyClass(Text.class);
  28. job.setOutputValueClass(Text.class);
  29. //输出数据,设置输出路径
  30. job.setOutputFormatClass(TextOutputFormat.class);
  31. TextOutputFormat.setOutputPath(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/5.大数据离线第五天/共同好友/step1_output"));
  32. //将任务提交至集群
  33. boolean b = job.waitForCompletion(true);
  34. return b ? 0 : 1;
  35. }
  36. public static void main(String[] args) throws Exception {
  37. int run = ToolRunner.run(new Configuration(), new Step1Main(), args);
  38. System.exit(run);
  39. }
  40. }

运行完成后,得到第一步的数据

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

创建第二步的package

在package中定义main、Mapper、Reducer三个类

定义一个Mapper类

  1. package cn.itcast.demo1.step2;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Mapper;
  5. import java.io.IOException;
  6. import java.util.Arrays;
  7. public class Step2Mapper extends Mapper<LongWritable, Text, Text, Text> {
  8. @Override
  9. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  10. //对拿到的数据进行分割,得到用户列表和好友
  11. String[] split = value.toString().split("\t");
  12. //再对用户列表进行分割,得到用户列表数组
  13. String[] userList = split[0].split("-");
  14. //因为文件中的数据并不是按照字典顺序进行排序,所以有可能会出来A-E E-A的情况,reduceTask是无法将这种情况视为key相同的
  15. //所以需要进行排序
  16. Arrays.sort(userList);
  17. for (int i = 0; i < userList.length - 1; i++) {
  18. for (int j = i + 1; j < userList.length; j++) {
  19. String userTwo = userList[i] + "-" + userList[j];
  20. context.write(new Text(userTwo), new Text(split[1]));
  21. }
  22. }
  23. }
  24. }

定义一个reducer类

  1. package cn.itcast.demo1.step2;
  2. import org.apache.hadoop.io.Text;
  3. import org.apache.hadoop.mapreduce.Reducer;
  4. import java.io.IOException;
  5. public class Step2Reducer extends Reducer<Text, Text, Text, Text> {
  6. @Override
  7. protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  8. //创建StringBuffer对象
  9. StringBuffer sb = new StringBuffer();
  10. for (Text value : values) {
  11. //获取共同好友列表
  12. sb.append(value.toString()).append("-");
  13. }
  14. context.write(key, new Text(sb.toString()));
  15. }
  16. }

程序main函数入口

  1. package cn.itcast.demo1.step2;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.conf.Configured;
  4. import org.apache.hadoop.fs.Path;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Job;
  7. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  8. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  9. import org.apache.hadoop.util.Tool;
  10. import org.apache.hadoop.util.ToolRunner;
  11. public class Step2Main extends Configured implements Tool {
  12. @Override
  13. public int run(String[] args) throws Exception {
  14. //创建job对象
  15. Job job = Job.getInstance(super.getConf(), "step2");
  16. //输入数据,设置输入路径
  17. job.setInputFormatClass(TextInputFormat.class);
  18. TextInputFormat.setInputPaths(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/5.大数据离线第五天/共同好友/step1_output"));
  19. //自定义map逻辑
  20. job.setMapperClass(Step2Mapper.class);
  21. //设置k2,v2输出类型
  22. job.setMapOutputKeyClass(Text.class);
  23. job.setMapOutputValueClass(Text.class);
  24. //自定义reduce逻辑
  25. job.setReducerClass(Step2Reducer.class);
  26. //设置k3,v3输出类型
  27. job.setOutputKeyClass(Text.class);
  28. job.setOutputValueClass(Text.class);
  29. //输出数据,设置输出路径
  30. job.setOutputFormatClass(TextOutputFormat.class);
  31. TextOutputFormat.setOutputPath(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/5.大数据离线第五天/共同好友/step2_output"));
  32. //提交任务至集群
  33. boolean b = job.waitForCompletion(true);
  34. return b ? 0 : 1;
  35. }
  36. public static void main(String[] args) throws Exception {
  37. int run = ToolRunner.run(new Configuration(), new Step2Main(), args);
  38. System.exit(run);
  39. }
  40. }

运行结果为

  1. A-B C-E-
  2. A-C D-F-
  3. A-D F-E-
  4. A-E C-B-D-
  5. A-F D-O-E-B-C-
  6. A-G C-D-F-E-
  7. A-H E-C-O-D-
  8. A-I O-
  9. A-J O-B-
  10. A-K C-D-
  11. A-L E-D-F-
  12. A-M F-E-
  13. B-C A-
  14. B-D E-A-
  15. B-E C-
  16. B-F E-A-C-
  17. B-G A-E-C-
  18. B-H E-C-A-
  19. B-I A-
  20. B-K A-C-
  21. B-L E-
  22. B-M E-
  23. B-O A-
  24. C-D F-A-
  25. C-E D-
  26. C-F A-D-
  27. C-G F-D-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 F-A-E-
  37. D-H A-E-
  38. D-I A-
  39. D-K A-
  40. D-L F-E-
  41. D-M F-E-
  42. D-O A-
  43. E-F M-C-B-D-
  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 A-D-E-C-
  50. F-H D-O-C-E-A-
  51. F-I O-A-
  52. F-J B-O-
  53. F-K A-D-C-
  54. F-L D-E-
  55. F-M E-
  56. F-O A-
  57. G-H E-A-C-D-
  58. G-I A-
  59. G-K C-D-A-
  60. G-L D-E-F-
  61. G-M E-F-
  62. G-O A-
  63. H-I O-A-
  64. H-J O-
  65. H-K D-A-C-
  66. H-L E-D-
  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 F-E-

【Hadoop离线基础总结】MapReduce 社交粉丝数据分析 求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?的更多相关文章

  1. 【Hadoop离线基础总结】impala简单介绍及安装部署

    目录 impala的简单介绍 概述 优点 缺点 impala和Hive的关系 impala如何和CDH一起工作 impala的架构及查询计划 impala/hive/spark 对比 impala的安 ...

  2. 【Hadoop离线基础总结】oozie的安装部署与使用

    目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...

  3. 【Hadoop离线基础总结】Hue的简单介绍和安装部署

    目录 Hue的简单介绍 概述 核心功能 安装部署 下载Hue的压缩包并上传到linux解压 编译安装启动 启动Hue进程 hue与其他框架的集成 Hue与Hadoop集成 Hue与Hive集成 Hue ...

  4. 【Hadoop离线基础总结】流量日志分析网站整体架构模块开发

    目录 数据仓库设计 维度建模概述 维度建模的三种模式 本项目中数据仓库的设计 ETL开发 创建ODS层数据表 导入ODS层数据 生成ODS层明细宽表 统计分析开发 流量分析 受访分析 访客visit分 ...

  5. 【Hadoop离线基础总结】Hive调优手段

    Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...

  6. 【Hadoop离线基础总结】Sqoop常用命令及参数

    目录 常用命令 常用公用参数 公用参数:数据库连接 公用参数:import 公用参数:export 公用参数:hive 常用命令&参数 从关系表导入--import 导出到关系表--expor ...

  7. 【Hadoop离线基础总结】MapReduce案例之自定义groupingComparator

    MapReduce案例之自定义groupingComparator 求取Top 1的数据 需求 求出每一个订单中成交金额最大的一笔交易 订单id 商品id 成交金额 Order_0000005 Pdt ...

  8. 【Hadoop离线基础总结】工作流调度器azkaban

    目录 Azkaban概述 工作流调度系统的作用 工作流调度系统的实现 常见工作流调度工具对比 Azkaban简单介绍 安装部署 Azkaban的编译 azkaban单服务模式安装与使用 azkaban ...

  9. 【Hadoop离线基础总结】数据仓库和hive的基本概念

    数据仓库和Hive的基本概念 数据仓库 概述 数据仓库英文全称为 Data Warehouse,一般简称为DW.主要目的是构建面向分析的集成化数据环境,主要职责是对仓库中的数据进行分析,支持我们做决策 ...

随机推荐

  1. python输出中文乱码

    首选项-浏览插件目录-USER文件夹 找到编译环境设置,编译方式为UTF-8编码 { "cmd": ["c:/Python36/python.exe",&quo ...

  2. Linux命令与Shell

    Linux 目录结构及解释 查看命令行执行完位置:  echo $BASH 命令记录 mkdir mkdir命令 用来创建目录. 语法:mkdir (选项)(参数) 主要选项: -m<目标属性& ...

  3. ArangoDB 3.5:流事务API、搜索性能大幅提升、最短路径功能

    ArangoDB 3.5 发布了.ArangoDB 是一个分布式原生的多模型数据库,具有灵活的文档.图形和键值数据模型.使用方便的 SQL 查询语言或 JavaScript 扩展构建高性能应用程序. ...

  4. python 携程asyncio 实现高并发示例2

    https://www.bilibili.com/video/BV1g7411k7MD?from=search&seid=13649975876676293013 import asyncio ...

  5. Java 反射 -- 获取泛型类型

    先写一个类: public class Demo03 { public void test01(Map<String, User> map, List<User> list) ...

  6. Java IO 流--FileUtils 工具类封装

    IO流的操作写多了,会发现都已一样的套路,为了使用方便我们可以模拟commosIo 封装一下自己的FileUtils 工具类: 1.封装文件拷贝: 文件拷贝需要输入输出流对接,通过输入流读取数据,然后 ...

  7. 轻量级mysql安装教程-避免采坑

    1:安装包获取 安装了很多次,来来回回踩,踩出了一片光明大道,简单好用. 百度网盘获取:链接:https://pan.baidu.com/s/13frFBTODaMeADZOHj5KdJQ 提取码:a ...

  8. Nginx知多少系列之(十四)Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

    目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.负载均衡策略 8.加权轮询(round rob ...

  9. 米特运输——(dfs)

    米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储 存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个城市由N- ...

  10. JQ获取select上的option的data-start和data-id

    来源:https://zhidao.baidu.com/question/692142321436883524.html 静态的写法: 用jq的attr()函数,如: HTML: <select ...