自定义bean对象实现序列化接口
上一个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对象实现序列化接口的更多相关文章
- Java JSON、XML文件/字符串与Bean对象互转解析
前言 在做web或者其他项目中,JSON与XML格式的数据是大家经常会碰见的2种.在与各种平台做数据对接的时候,JSON与XML格式也是基本的数据传递格式,本文主要简单的介绍JSON/XML ...
- 向虚拟机注册钩子,实现Bean对象的初始化和销毁方法
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 有什么方式,能给代码留条活路? 有人说:人人都是产品经理,那你知道吗,人人也都可以是 ...
- 如何使用Externalizable接口自定义Java中的序列化
Java序列化过程的缺点 我们都知道如何使用Serializable接口序列化/反序列化一个对象,并且如何使用writeObject 和readObject方法自定义序列化过程. 但是这些自定义还不够 ...
- spring mvc返回json字符串数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable
1.spring mvc返回json数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable 2. @RequestMapping(val ...
- Activity之间传递数据或数据包Bundle,传递对象,对象序列化,对象实现Parcelable接口
package com.gaojinhua.android.activitymsg; import android.content.Intent; import android.os.Bundle; ...
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...
- 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 ...
- IO(四)----对象的序列化
对象的序列化: 将内存中的对象直接写入到文件设备中. 对象的反序列化: 将文件设备中持久化的数据转换为内存对象. 自定义类只要实现了Serializable接口,便可以通过对象输入输出流对对象进行 ...
- Qt持久性对象进行序列化
Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的 ...
随机推荐
- 羽夏 Bash 简明教程(下)
写在前面 该文章根据 the unix workbench 中的 Bash Programming 进行汉化处理并作出自己的整理,并参考 Bash 脚本教程 和 BashPitfalls 相关内容 ...
- AC自动机:Tire树+KMP
简介 AC自动机是一个多模式匹配算法,在模式匹配领域被广泛应用,举一个经典的例子,违禁词查找并替换为***.AC自动机其实是Trie树和KMP 算法的结合,首先将多模式串建立一个Tire树,然后结合K ...
- python 通过线上API查询ip归属地
API为国外API,频率限制1分钟45个ip 脚本如下 1 #!/usr/bin/env python3 2 #-*-coding:utf-8-*- 3 4 import requests,re,js ...
- TyepScript学习
前提 JS缺陷 (1)变量频繁变换类型,类型不明确难以维护 TS定义 (1)定义 以JavaScript为基础构建的语音,一个JavaScript的超集,扩展js添加了类型, 可以在任何支持js的平台 ...
- 行列式&矩阵树定理
行列式: 参考 oi-wiki 定义 对于一个\(n*n\)的矩阵A行列式取值(标量) \(det(A)=|A|=\sum\limits_p(-1)^{\tau(p)}\prod\limits_{i= ...
- mysql数据恢复 根据旧备份的sql文件和当前data下的ibd文件恢复innodb引擎数据
1.使用navicat fro mysql数据库工具进行恢复 2.将原有备份的sql文件导入数据库 3.新建一个空数据库 4将备份数据库的数据表复制到新建数据库(只复制表格式) 5.在命令行模式中 u ...
- .NET Core 企业微信回调配置
1.配置API接收 2.下载加密解密库 地址:https://developer.work.weixin.qq.com/devtool/introduce?id=36388,也可以复制下面的代码 2. ...
- JS:eval
定义和用法: eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行.eval()函数并不会创建一个新的作用域,并且它的作用域就是它所在的作用域. 如果参数是一个表达式,eva ...
- BUUCTF-九连环
九连环 这题还是稍微有点难度的 使用16进制打开发现压缩包,用binwalk分离看看 分离得到的压缩包同样16进制看看 可以发现多个压缩包,这种情况应该是伪加密的方式,但是直接使用修复压缩包的方式没法 ...
- HDLBits->Circuits->Arithmetic Circuitd->3-bit binary adder
Verilog实例数组 对于一个定义好的简单module,例如加法器之类,如果我们要对其进行几十次几百次的例化,并且这些例化基本都是相同的形式,那么我们肯定不能一个个的单独对其进行例化,此时我们就可以 ...