自定义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则是所属的 ...
随机推荐
- HCNP Routing&Switching之RSTP保护
前文我们了解了RSTP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16240348.html:今天我们来聊一聊RSTP保护相关话题: 我们知道RST ...
- Java 16 新特性:record类
以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类.record关键词的引入,主要是为了提供一种更为简洁.紧凑的final类的定义方式. ...
- Redis 的数据过期了就会马上删除么?
码哥,当 key 达到过期时间,Redis 就会马上删除么? 先说结论,并不会立马删除,Redis 有两种删除过期数据的策略: 定期选取部分数据删除: 惰性删除: 该命令在 Redis 2.4 版本, ...
- 1.Spring开发环境搭建——intellj
1.在intellj中新建项目,选择JDK版本(1.8版本) 2.选择相关信息填写,注意Java版本要和上面步骤选择的版本一致. 3.选择springBoot版本,勾选Spring Web选项. 4. ...
- HIVE 数据分析
题目要求: 具体操作: ①hive路径下建表:sale create table sale (day_id String, sale_nbr String, buy_nbr String, cnt S ...
- 08shell脚本
shell脚本编程 1.1简介 什么是shell脚本 shell脚本: 就是一些命令的集合, 在脚本文件中可以有流程控制, 如顺序, 条件分支和循环等 脚本文件一般一.sh文件为扩展名, 但是不是必须 ...
- CXP 协议中upconnection 与downconnection的说明及其区别
概述 CXP定义了一个DEVICE和HOST之间点对点的连接协议.CXP的一个连接包含了一个MASTER物理连接和若干可选的SLAVE连接,每一个连接都定义了一组逻辑通道用于传输图像数据.实时触发.设 ...
- 『忘了再学』Shell基础 — 24、Shell正则表达式的使用
目录 1.正则表达式说明 2.基础正则表达式 3.练习 (1)准备工作 (2)*练习 (3).练习 (4)^和$练习 (5)[]练习 (6)[^]练习 (7)\{n\}练习 (8)\{n,\}练习 ( ...
- 小样本利器1.半监督一致性正则 Temporal Ensemble & Mean Teacher代码实现
这个系列我们用现实中经常碰到的小样本问题来串联半监督,文本对抗,文本增强等模型优化方案.小样本的核心在于如何在有限的标注样本上,最大化模型的泛化能力,让模型对unseen的样本拥有很好的预测效果.之前 ...
- SQL Server 2019企业版和标准版的区别?
来源公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485400&idx=1&a ...