MapReduce 序列化案例

news2024/11/15 10:57:11

文章目录

  • MapReduce 序列化案例
    • 一、案例需求
    • 二、案例分析
      • map 阶段
      • Reduce 阶段
    • 三、代码实现
      • 1、编写流量统计的Bean对象
      • 2、Mapper阶段代码

MapReduce 序列化案例

一、案例需求

1、需求:
统计每一个手机号耗费的总上行流量,下行流量,总流量在这里插入图片描述
2、输入数据格式:
在这里插入图片描述
3、期望输出数据格式
在这里插入图片描述

二、案例分析

具体流程可以看下面这个流程图,首先是读取输入进来的数据,然后期望得到什么格式的数据,然后map阶段进行切分子字段,抽取字段,Reducer阶段只需要将上行流量和下行流量进行相加就可以得到总的流量了
在这里插入图片描述

map 阶段

map 阶段需要读取出一行,然后切分出字段,然后抽取出字段,只需要手机号码,上行流量,下行流量这三个字段就行了,其他的都不需要。然后以手机号为key,bean对象为value输出,即context.write(手机号,bean),然后bean对象想要能够传输,必须要实现序列化接口

Reduce 阶段

Reduce 阶段,将相同手机号的上行流量 + 下行流量 累加求和 = 总流量

三、代码实现

1、编写流量统计的Bean对象

因为等下map阶段的时候就要用到这个bean对象,所以先写他
首先是要先定义三个属性,upFlow,downFlow,sumFlow 上行流量下行流量和总流量的,然后下面是一个空参构造,这个是必须要写的,然后下面一个有参数的构造函数可写可不写,然后下面是重写序列化和反序列化方法,序列化的顺序和反序列化的顺序一定要一致,然后重写toString方法 用 "\t"来进行分割
字段然后下面就是settergetter方法了,

package com.aex.mr;

import org.apache.hadoop.io.Writable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
//实现Writable接口
public class FlowBean implements Writable {
    //接下来定义它的属性
    private long upFlow; //上行流量
    private long downFlow; //下行流行
    private long sumFlow; //总流量
    //想要实现序列化,得重写一个空参构造,为了后面反射用
    public FlowBean(){
        super();
    }
    //再要一个有参数的构造函数只有上行流量和下行流量,方便后面使用
    public FlowBean(long upFlow, long downFlow) {
        this.upFlow = upFlow;
        this.downFlow = downFlow;
        sumFlow = upFlow + downFlow; //这一句话写出来,直接就是sumFlow = upFlow+downFlow
    }

    //它要想实现序列化,需要重写一个空参构造
    @Override //要求重写这两个方法,序列化方法
    public void write(DataOutput out) throws IOException {
        //注意顺序问题,序列化的顺序和反序列化的顺序得是一样的
        out.writeLong(upFlow); //我们的数据是long类型的,然后写进来就是writeLong
        out.writeLong(downFlow);
        out.writeLong(sumFlow);
    }

    @Override //反序列化方法
    public void readFields(DataInput in) throws IOException {
        //必须要求和序列化方法循序一致
        upFlow = in.readLong(); //接收的时候又把他们转换回去
        downFlow = in.readLong();
        sumFlow = in.readLong();

    }

    @Override //重写一下toString 切割的时候都统一使用这个"\t" 来进行切割了
    public String toString() {
        return upFlow + "\t"+ downFlow + "\t" +sumFlow;
    }
    //下面再生产set和get方法
    public long getUpFlow() {
        return upFlow;
    }

    public void setUpFlow(long upFlow) {
        this.upFlow = upFlow;
    }

    public long getDownFlow() {
        return downFlow;
    }

    public void setDownFlow(long downFlow) {
        this.downFlow = downFlow;
    }

    public long getSumFlow() {
        return sumFlow;
    }

    public void setSumFlow(long sumFlow) {
        this.sumFlow = sumFlow;
    }
}

2、Mapper阶段代码

首先获取一行数据,转换成String类型进行操作,然后使用split方法,用"\t"进行切割成六个数据。然后返回到字符串数组filesd里面去,然后封装对象,电话号码是key bean对象是value,手机号就是数组的第二个位置fileds[1],就可以取出来了,这个上行流量和下行流量有点不一样,因为有些域名这个字段是空的导致索引有些有变化,那就倒着从数组里面找,fileds[fileds.lenght - 3]fileds[fileds.lenght - 2] 就可以找到上行流量和下行流量了,最后见他们写出,context,write() 第一个参数是键,也就是手机号,第二个参数是值也就是bean对象

package com.aex.mr;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

//第一个参数,偏移量,第二个参数,读取进来的数据,第三个是输出的键的类型,第四个是输出的值的类型
//读取进来的数据是String类型的,然后输出是手机号为key,bean对象为value,手机号是String类型的
public class FlowCountMapper extends Mapper<LongWritable,Text,Text,FlowBean> {
    Text k = new Text(); //把他们放在上面
    FlowBean v = new FlowBean();
    @Override
    protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {
        // 7 13560436666 120.196.100.99 1116 954 200
        // 1 获取一行
        String line = value.toString(); //它是Text类型的得把他变成String类型的
        // 2 切割"\t" 7 13560436666 120.196.100.99 1116 954 200相当于把这一行切割成6个数据然后存在这个字符串数组fileds里
        String[] fileds = line.split("\t");
        // 3 封装对象 
        //Text k = new Text(); 把他们放在上面
        //FlowBean v = new FlowBean();
        k.set(fileds[1]); //这个手机号是数组的第二个位置上,直接这样取出
        //上行流量,下行流量和这个手机号还有点一样,因为有些域名是空着的,导致索引会不一样
        //这个上行流量是long类型的但是这个数据放在字符串数组里是Sting类型的,所以转换成long类型的就可以了,
        //用数组的长度-3,-2 倒着找,就是上行流量和下行流量索引的位置
        long upFlow = Long.parseLong(fileds[fileds.length-3]);
        long downFlow = Long.parseLong(fileds[fileds.length-2]);
        v.setUpFlow(upFlow);
        v.setDownFlow(downFlow);
        // 4 写出
        context.write(k,v); //手机号,bean对象
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二、ZFNet可视化卷积神经网络——可解释性机器学习(DataWhale组队学习)

目录引言ZFNet的网络结构可视化反卷积反池化反激活反卷积训练细节特征可视化特征演化特征不变性局部遮挡测试敏感性分析相关性分析消融实验宽度影响深度影响迁移学习能力有效性分析总结引言 纽约大学ZFNet&#xff0c;2013年ImageNet图像分类竞赛冠军模型。对AlexNet进行改进的…

AOP 操作

AOP 操作AOP 操作&#xff08;准备&#xff09;1. Spring 框架一般是基于 AspectJ 实现 AOP 操作&#xff08;1&#xff09;什么是 AspectJ2. 基于 AspectJ 实现 AOP 操作3. 在项目工程里面引入 AOP 先关的依赖4. 切入点表达式举例1&#xff1a;对 com.fairykunkun.dao.UserDao…

谈谈自己对依赖注入的理解

1. 絮絮叨叨 1.1 想学习Google Guice 在工作的过程中&#xff0c;发现有名的大数据组件Presto大量使用Google Guice实现各种Module的构建 很多bind(interface).to(implementClass).in(scope)语句&#xff0c;实现接口与实现类的绑定&#xff0c;并指定实现类是单例还是多例 /…

Service的绑定过程

前言 Service的绑定过程将分为两个部分来进行讲解&#xff1b;分别是Contextlmpl到AMS的调用过程和Service的绑定过程。 frameworks/base/core/java/android/content/ContextWrapper.javapublic boolean bindService(Intent service, ServiceConnection conn,int flags) {ret…

计算机毕设Python+Vue-新型冠状病毒防控咨询网站(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

根据端口划分虚拟局域、集线器、中继器、交换机、路由器、网桥----计算机网络

集线器&#xff1a; 连接计算机和交换机&#xff0c;类似于多台中继器。 实现多台电脑的同时使用一个进线接口来上网或组成局域网 中继器&#xff1a; 连接两条电缆&#xff0c;作用是放大前一条电缆里面的信号并传入下一条电缆。 是对接收到的信息进行再生放大&#xff0c;以…

Jenkins + Jmeter + Ant 持续集成

搭建提前安装好&#xff1a;ant Jenkins 环境 一、Jenkins 安装 Ant 插件&#xff1a; 进入Jenkins 配置插件页面&#xff0c;安装ant 插件&#xff1a; 打开插件配置页面&#xff0c;如下图&#xff1a; 点击“Available” 在输入框搜索 ant 安装即可&#xff1a; 二、安装…

计算机毕业设计springboot+vue基本微信小程序的透析耗材管理系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理程序应运而生,各行各业相继进入信息管理时代,透析耗材管理小程序就是信息时代变革中的产物之一。 任何程序都要遵循…

vue前端案例教学:动态获取最新疫情数据展示(代码详解)

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

[leetcode.4]寻找两个正序数组的中位数 多思考边界

题目展示 题目要点 题目其实本身的思路非常简单&#xff0c;就是把两个数组给合并起来&#xff0c;然后寻找中位数&#xff0c;具体可以参考我们使用归并排序时候的最后一步&#xff0c;这题的难点其实在于&#xff08;1&#xff09;时间压缩到lognm&#xff08;2&#xff09;…

[附源码]Nodejs计算机毕业设计基于与协同过滤算法的竞赛项目管理Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

基于MMEngine和MMDet搭建目标跟踪框架MMTracking-1.0.0rc1-Win10

缘由&#xff1a; 1. 目标跟踪是工业检测和学术研究的基础课题&#xff0c;其pipeline通常分为视频目标检测、视频实例分割、单目标跟踪、多目标跟踪和Re-ID五类&#xff0c;同时&#xff0c;还细分为在线检测和离线检测两种任务模式。由于现阶段关于目标跟踪的教程较少&#…

机器学习 KNN算法原理

目录 一&#xff1a;KNN算法概念 二&#xff1a;KNN原理 三&#xff1a;KNN超参数 四&#xff1a;KNN算法选择 一&#xff1a;KNN算法概念 KNN(K-Nearest Neighbor)法即K最邻近法&#xff0c;最初由Cover和Hart于1968年提出&#xff0c;是最简单的机器学习算法之一 算法思路…

NNDL 作业9:分别使用numpy和pytorch实现BPTT

6-1P&#xff1a;推导RNN反向传播算法BPTT. 6-2P&#xff1a;设计简单RNN模型&#xff0c;分别用Numpy、Pytorch实现反向传播算子&#xff0c;并代入数值测试.、 forward&#xff1a; 我们知道循环卷积网络的cell的计算公式为&#xff1a; stf(UxtWst−1)\mathrm{s}_tf(…

UML学习入门

UML 举一个简单的例子&#xff0c;来看这样一副图&#xff0c;其中就包括了UML类图中的基本图示法。 首先&#xff0c;看动物矩形框&#xff0c;它代表一个类&#xff08;Class&#xff09;。类图分三层&#xff0c;第一层显示类的名称&#xff0c;如果是抽象类&#xff0c;则…

多模块之前的消息引用问题

多模块引用之前的问题目录概述需求&#xff1a;设计思路实现思路分析1.在第一个模块中调用另一个调用模块的Bean2.普通java类 如何获取另一个模块的Bean3.启用消息机制4.为什么普通java类很难调用SpringBean的&#xff1f;参考资料和推荐阅读Survive by day and develop by nig…

机器学习快速上手基础

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。 目录 一、简介与应该明确的学习方法 1、学习方法 2、简介 二、学习机器学习的优势 三、机器学习的内核 1、学习术语 2、内核 四、机器学习…

IT团队自动化端点管理解决方案—基于虹科Chef工具

企业如何简化端点管理工作流程&#xff1f; 如何解决安全事件&#xff1f;如何生成审计报告&#xff1f;如何处理大量账单&#xff1f;这些都是企业IT团队需要考虑的问题。然而&#xff0c;IT人员每天有大量的事情需要处理&#xff0c;如何自动化、标准化、及时性的处理这些问…

(最优化理论与方法)第六章无约束优化算法-第二节:梯度类算法

文章目录一&#xff1a;次梯度算法&#xff08;1&#xff09;次梯度算法结构&#xff08;2&#xff09;应用举例-LASSO问题求解二&#xff1a;牛顿法&#xff08;1&#xff09;经典牛顿法&#xff08;2&#xff09;修正牛顿法三&#xff1a;拟牛顿法&#xff08;1&#xff09;拟…

知到/智慧树——英语听说:实境主题与技能(参考答案)

目录 第一章测试 第二章测试 第三章测试 第四章测试 第五章测试 第六章测试 第七章测试 第八章测试 第九章测试 第十章测试 第一章测试 第1部分总题数: 10 1 【多选题】 (10分) What does this chapter mainly teach &#xff08; &#xff09;&#xff1f; A. T…