上一个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. 操作系统实现-printk

    博客网址:www.shicoder.top 微信:18223081347 欢迎加群聊天 :452380935 这一次我们来实现最基础,也是最常见的函数print,大家都知道这个是可变参数函数,那具体怎 ...

  2. Python实现将excel文件转化为html文件

    需要转化的excel文件(nsrxx.xlsx): 源代码: import pandas as pdimport codecspd.set_option('display.width', 1000)p ...

  3. 成本节省 50%,10 人团队使用函数计算开发 wolai 在线文档应用

    作者: 马锐拉 我们的日常工作场景几乎离不开"云文档".目前,人们对于文档的需求再不仅仅是简单的记录,而扩展到办公协同.信息组织.知识分享等.在国内众多在线文档中,wolai 因为 ...

  4. 2022Gartner容器预测:2025年85%的企业将使用容器管理服务

    近日,国际知名权威分析机构Gartner发布了最新<全球容器管理预测>.预测中指出:在加速的数字化转型驱动下,到2025年全球容器管理领域市场规模将突破14亿美元,预计年复合增长率将达到2 ...

  5. Druid数据库连接池使用体验

    写在前面 在实际工作中我们我们使用较多的则是Spring默认的HikariDataSource数据库连接池,但是它无法提供可视化监控SQL这一能力,而这在很多场景下往往又是我们需要的功能,因此今天来学 ...

  6. 数组——JavaSE基础

    数组 数组初始化 public class ArrayDemo02 { public static void main(String[] args) { // 静态初始化 int[] a = {1, ...

  7. Eureka属性配置

    一:Eureka Instance实例信息配置   里面的配置以"-"隔开 其实也支持驼峰命名代替"-" 首先是入门时的配置: server: port: 80 ...

  8. 如何写一个全局的 Notice 组件?

    下面将会实现这样的效果: 组件动态创建脚本: NotificationBanner.js import Vue from "vue"; import Notice from &qu ...

  9. node.js 创建 wss服务

    var https=require('https'); var ws=require('ws'); var fs=require('fs'); var keypath=process.cwd()+'/ ...

  10. BUUCTF-你竟然赶我走

    你竟然赶我走 首先看到这个图片没啥感觉,直接用16进制打开了.拖到最下面果然有flag flag{stego_is_s0_bor1ing}