上一个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. 详解TCP三次握手(建立TCP连接过程)

    在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构. 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数 ...

  2. CF1580E Railway Construction

    CF1580E Railway Construction 铁路系统中有 \(n\) 个车站和 \(m\) 条双向边,有边权,无重边.这些双向边使得任意两个车站互相可达. 你现在要加一些单向边 \((u ...

  3. leetcode 4. Median of Two Sorted Arrays 寻找两个正序数组的中位数(困难)

    一.题目大意 标签: 查找 https://leetcode.cn/problems/median-of-two-sorted-arrays 给定两个大小分别为 m 和 n 的正序(从小到大)数组 n ...

  4. 聊聊OOP中的设计原则以及访问者模式

    一  设计原则 (SOLID) 1.  S - 单一职责原则(Single Responsibllity Principle) 1.1  定义 一个类或者模块只负责完成一个职责(或功能), 认为&qu ...

  5. 前端4BOM与DOM

    内容概要 BOM操作(了解) DOM操作 DOM操作标签 获取值操作 属性操作 事件 -事件案例 内容详情 BOM操作(了解)

  6. 更换conda镜像源、pip镜像源

    镜像源一般有两点特别需要注意,一个是Conda源,一个是Pip源: 更换Conda源,以更换清华Conda源为例: Anaconda 镜像使用帮助 Anaconda 是一个用于科学计算的 Python ...

  7. ExtJS 布局-VBox布局(VBox layout)

    更新记录: 2022年6月11日 优化文章结构. 2022年6月9日 发布. 2022年6月1日 开始. 1.说明 vbox布局类似auto布局,将子组件一个接一个垂直向下放置,既可以在水平方向也可以 ...

  8. 开发工具-Visual Studio / Visual Studio Code 官方下载地址

    更新记录 2022年6月10日 完善标题. Visual Studio官方下载地址 https://visualstudio.microsoft.com/ Visual Studio Code官方下载 ...

  9. Python爬虫-正则

    介绍: 是 一门全新的语言,一种使用表达式的方式对字符串进行匹配的语法规则 我们抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再适合不过 优点:速度快.效率高.准确性高 缺点: ...

  10. SAP BDC 调用中 金额格式转换

    在BDC调用中,由于用户设置不同,导致金额.日期等字段的输入格式不正确.此处给出 自创 金额转换FM 并配有 调用方式. function zgm_conver_cuur. *"------ ...