上一个word count的案例中,我们为了理解mapreduce的流程,写了上面的代码。现在我们要把一个实体类序列化。比如现在有这么一个文件,里面的数据格式是这样的:

第一列是时间戳,第二列是手机号码,第三列是设备的物理地址,第四列是访问网站的ip地址,第五列是网站域名,第六列是数据包,下一列是接包数,关键是最后三列,上行流量,下行流量,最后一列是状态码。

现在我们要统计每个手机号的上行流量总和,下行流量总和,以及上下行流量总和。在这里我们要用到第二列,倒数第二列,导数第三列数据,这个时候基本类型就无法满足我们的加工要求了,这个时候我们就需要封装一个实体类。

在封装实体类之气那我们要了解一下bean对象序列化的注意事项:

这个流程我们整理一下:

map阶段:

1,读取每一行数据,切分字段

2,取手机号,上行流量,下行流量

3,以手机号作为key,在reduce阶段就可以根据可以key统计流量总和,然后以bean对象作为value,这个bean对象包含三个字段:手机号,上行流量,下行流量

reduce阶段:

1,累加同一个手机号的上行总和,下行总和,上下行总和。

2,keyout:vout,手机号:上行综合,下行总和,上下行总和封装到bean,这样我们的bean里面就最少要包含以前字段:手机号,上行流量,下行流量,上下行总和

规划完了,准备开始代码,先建一个phone包,就建在MR下面,然后创建一个实体类:phoneBean,如下:

我们先确定要封装的字段,

private String phoneNUmber;
private long upFlow;
private long downFlow;
private long sumFlow;

确定好字段以后,添加一个构造器,这个空参构造一定要有,序列化的时候要用到空参构造

IDEA快捷键:alt+insert,调出空参构造,setter,getter方法,to_string方法也重写一下。由于这个对象要在网络之间传输,需要序列化,就要实现Writable接口,并且重写write和readFidlds方法,统统用快捷键给他加进去,然后重写一下序列化和反序列方法,最后这个Phonebean就是这样:

package MR.phone;

import org.apache.hadoop.io.Writable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class PhoneBean implements Writable {
private String phoneNUmber;
private long upFlow;
private long downFlow;
private long sumFlow;
//反序列化需要用到空参构造
public PhoneBean() {
}

public String getPhoneNUmber() {
return phoneNUmber;
}

public void setPhoneNUmber(String phoneNUmber) {
this.phoneNUmber = phoneNUmber;
}

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;
}

@Override
public String toString() {
return "PhoneBean{" +
"phoneNUmber='" + phoneNUmber + '\'' +
", upFlow=" + upFlow +
", downFlow=" + downFlow +
", sumFlow=" + sumFlow +
'}';
}
//重写序列化方法,写成二进制方便网络传输
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(phoneNUmber);
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}
//重写反序列方法,注意序列化和反序列化这个字段顺序要保持一致
@Override
public void readFields(DataInput in) throws IOException {
this.phoneNUmber=in.readUTF();
this.upFlow=in.readLong();
this.downFlow=in.readLong();
this.sumFlow=in.readLong();
}
}

自定义bean对象实现序列化接口的更多相关文章

  1. Java JSON、XML文件/字符串与Bean对象互转解析

    前言      在做web或者其他项目中,JSON与XML格式的数据是大家经常会碰见的2种.在与各种平台做数据对接的时候,JSON与XML格式也是基本的数据传递格式,本文主要简单的介绍JSON/XML ...

  2. 向虚拟机注册钩子,实现Bean对象的初始化和销毁方法

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 有什么方式,能给代码留条活路? 有人说:人人都是产品经理,那你知道吗,人人也都可以是 ...

  3. 如何使用Externalizable接口自定义Java中的序列化

    Java序列化过程的缺点 我们都知道如何使用Serializable接口序列化/反序列化一个对象,并且如何使用writeObject 和readObject方法自定义序列化过程. 但是这些自定义还不够 ...

  4. spring mvc返回json字符串数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable

    1.spring mvc返回json数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable 2. @RequestMapping(val ...

  5. Activity之间传递数据或数据包Bundle,传递对象,对象序列化,对象实现Parcelable接口

    package com.gaojinhua.android.activitymsg; import android.content.Intent; import android.os.Bundle; ...

  6. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...

  7. CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)

    由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  8. IO(四)----对象的序列化

    对象的序列化:   将内存中的对象直接写入到文件设备中. 对象的反序列化: 将文件设备中持久化的数据转换为内存对象. 自定义类只要实现了Serializable接口,便可以通过对象输入输出流对对象进行 ...

  9. Qt持久性对象进行序列化

    Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的 ...

随机推荐

  1. 羽夏 Bash 简明教程(下)

    写在前面   该文章根据 the unix workbench 中的 Bash Programming 进行汉化处理并作出自己的整理,并参考 Bash 脚本教程 和 BashPitfalls 相关内容 ...

  2. AC自动机:Tire树+KMP

    简介 AC自动机是一个多模式匹配算法,在模式匹配领域被广泛应用,举一个经典的例子,违禁词查找并替换为***.AC自动机其实是Trie树和KMP 算法的结合,首先将多模式串建立一个Tire树,然后结合K ...

  3. python 通过线上API查询ip归属地

    API为国外API,频率限制1分钟45个ip 脚本如下 1 #!/usr/bin/env python3 2 #-*-coding:utf-8-*- 3 4 import requests,re,js ...

  4. TyepScript学习

    前提 JS缺陷 (1)变量频繁变换类型,类型不明确难以维护 TS定义 (1)定义 以JavaScript为基础构建的语音,一个JavaScript的超集,扩展js添加了类型, 可以在任何支持js的平台 ...

  5. 行列式&矩阵树定理

    行列式: 参考 oi-wiki 定义 对于一个\(n*n\)的矩阵A行列式取值(标量) \(det(A)=|A|=\sum\limits_p(-1)^{\tau(p)}\prod\limits_{i= ...

  6. mysql数据恢复 根据旧备份的sql文件和当前data下的ibd文件恢复innodb引擎数据

    1.使用navicat fro mysql数据库工具进行恢复 2.将原有备份的sql文件导入数据库 3.新建一个空数据库 4将备份数据库的数据表复制到新建数据库(只复制表格式) 5.在命令行模式中 u ...

  7. .NET Core 企业微信回调配置

    1.配置API接收 2.下载加密解密库 地址:https://developer.work.weixin.qq.com/devtool/introduce?id=36388,也可以复制下面的代码 2. ...

  8. JS:eval

    定义和用法: eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行.eval()函数并不会创建一个新的作用域,并且它的作用域就是它所在的作用域. 如果参数是一个表达式,eva ...

  9. BUUCTF-九连环

    九连环 这题还是稍微有点难度的 使用16进制打开发现压缩包,用binwalk分离看看 分离得到的压缩包同样16进制看看 可以发现多个压缩包,这种情况应该是伪加密的方式,但是直接使用修复压缩包的方式没法 ...

  10. HDLBits->Circuits->Arithmetic Circuitd->3-bit binary adder

    Verilog实例数组 对于一个定义好的简单module,例如加法器之类,如果我们要对其进行几十次几百次的例化,并且这些例化基本都是相同的形式,那么我们肯定不能一个个的单独对其进行例化,此时我们就可以 ...