MapReduce 社交粉丝数据分析


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

  • 用户及好友数据
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
  • java代码

需要两步完成需求

首先先创建第一步的package

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

定义一个Mapper类

package cn.itcast.demo1.step1;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class Step1Mapper extends Mapper<LongWritable, Text, Text, Text> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//输入数据如下格式 A:B,C,D,E,O
//将用户和好友列表分开
String[] split = value.toString().split(":");
//将好友列表分开,放到一个数组中去
String[] friendList = split[1].split(",");
//循环遍历,输出的k2,v2格式为 B [A,E]
for (String friend : friendList) {
context.write(new Text(friend), new Text(split[0]));
}
}
}

定义一个Reducer类

package cn.itcast.demo1.step1;

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

程序main函数入口

package cn.itcast.demo1.step1;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; public class Step1Main extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
//创建job对象
Job job = Job.getInstance(super.getConf(), "step1");
//输入数据,设置输入路径
job.setInputFormatClass(TextInputFormat.class);
TextInputFormat.setInputPaths(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/5.大数据离线第五天/共同好友/input/friends.txt")); //自定义map逻辑
job.setMapperClass(Step1Mapper.class);
//设置k2,v2输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class); //自定义reduce逻辑
job.setReducerClass(Step1Reducer.class);
//设置k3,v3输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); //输出数据,设置输出路径
job.setOutputFormatClass(TextOutputFormat.class);
TextOutputFormat.setOutputPath(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/5.大数据离线第五天/共同好友/step1_output")); //将任务提交至集群
boolean b = job.waitForCompletion(true);
return b ? 0 : 1;
} public static void main(String[] args) throws Exception {
int run = ToolRunner.run(new Configuration(), new Step1Main(), args);
System.exit(run);
}
}

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

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

创建第二步的package

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

定义一个Mapper类

package cn.itcast.demo1.step2;

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

定义一个reducer类

package cn.itcast.demo1.step2;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class Step2Reducer extends Reducer<Text, Text, Text, Text> {
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
//创建StringBuffer对象
StringBuffer sb = new StringBuffer();
for (Text value : values) {
//获取共同好友列表
sb.append(value.toString()).append("-");
}
context.write(key, new Text(sb.toString()));
}
}

程序main函数入口

package cn.itcast.demo1.step2;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; public class Step2Main extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
//创建job对象
Job job = Job.getInstance(super.getConf(), "step2");
//输入数据,设置输入路径
job.setInputFormatClass(TextInputFormat.class);
TextInputFormat.setInputPaths(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/5.大数据离线第五天/共同好友/step1_output")); //自定义map逻辑
job.setMapperClass(Step2Mapper.class);
//设置k2,v2输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class); //自定义reduce逻辑
job.setReducerClass(Step2Reducer.class);
//设置k3,v3输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); //输出数据,设置输出路径
job.setOutputFormatClass(TextOutputFormat.class);
TextOutputFormat.setOutputPath(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/5.大数据离线第五天/共同好友/step2_output")); //提交任务至集群
boolean b = job.waitForCompletion(true);
return b ? 0 : 1;
} public static void main(String[] args) throws Exception {
int run = ToolRunner.run(new Configuration(), new Step2Main(), args);
System.exit(run);
}
}

运行结果为

A-B	C-E-
A-C D-F-
A-D F-E-
A-E C-B-D-
A-F D-O-E-B-C-
A-G C-D-F-E-
A-H E-C-O-D-
A-I O-
A-J O-B-
A-K C-D-
A-L E-D-F-
A-M F-E-
B-C A-
B-D E-A-
B-E C-
B-F E-A-C-
B-G A-E-C-
B-H E-C-A-
B-I A-
B-K A-C-
B-L E-
B-M E-
B-O A-
C-D F-A-
C-E D-
C-F A-D-
C-G F-D-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 F-A-E-
D-H A-E-
D-I A-
D-K A-
D-L F-E-
D-M F-E-
D-O A-
E-F M-C-B-D-
E-G C-D-
E-H C-D-
E-J B-
E-K C-D-
E-L D-
F-G A-D-E-C-
F-H D-O-C-E-A-
F-I O-A-
F-J B-O-
F-K A-D-C-
F-L D-E-
F-M E-
F-O A-
G-H E-A-C-D-
G-I A-
G-K C-D-A-
G-L D-E-F-
G-M E-F-
G-O A-
H-I O-A-
H-J O-
H-K D-A-C-
H-L E-D-
H-M E-
H-O A-
I-J O-
I-K A-
I-O A-
K-L D-
K-O A-
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. 解决click与hover(mouseover)的冲突问题

    主要应用到一个知识点:$(selector).data('name','value'); <!DOCTYPE HTML> <html> <head> <met ...

  2. 45道SQL数据题详解1

    准备阶段: 创建表: //创建学生表,前面的s表示学生,相应的标签前面加t表示老师 CREATE TABLE students (sno VARCHAR(3) NOT NULL, sname VARC ...

  3. [YII2] 展示页面显示图片 以及手机号隐藏为*和姓名隐藏姓为*,

  4. 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥

    P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...

  5. 聊聊Spring Boot Actuator

    概述 在本文中,我们将介绍Spring Boot Actuator.我们将首先介绍基础知识,然后详细讨论Spring Boot 1.x和2.x中的可用内容. 我们将在Spring Boot 1.x中学 ...

  6. 设计模式 - 迭代器模式详解及其在ArrayList中的应用

    基本介绍 迭代器模式(Iterator Pattern)是 Java 中使用最多的一种模式,它可以顺序的访问容器中的元素,但不需要知道容器的内部细节 模式结构 Iterator(抽象迭代器):定义遍历 ...

  7. [USACO3.2]魔板 Magic Squares

    松下问童子,言师采药去. 只在此山中,云深不知处.--贾岛 题目:魔板 Magic Squares 网址:https://www.luogu.com.cn/problem/P2730 这是一张有8个大 ...

  8. 理解分布式一致性:Paxos协议之Multi-Paxos

    理解分布式一致性:Paxos协议之Multi-Paxos Multi-Paxos without failures Multi-Paxos when phase 1 can be skipped Mu ...

  9. java 之 servlet简介

    Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间 ...

  10. 微软宣布一批新获得Microsoft Teams认证的会议硬件

    COVID-19 疾病流行期间,微软见到了 Microsoft Teams 视频会议解决方案取得的巨大增长.然而在许多情况下,生产力与音视频硬件的质量息息相关.好消息是,该公司刚刚完成了一批第三方硬件 ...