3.Hadoop序列化
3.1概述
序列化和反序列化
- 序列化就是把内存中的对象,转换成字节序列,以便于储存到磁盘和网络传输
- 反序列化就是将收到的字节序列或者是磁盘的持久化数据,转换成内存中的对象
序列化特点
- 紧凑:高效使用存储空间
- 快速:读写数据的额外开支较小
- 可拓展:随着通信协议的升级而升级
- 互操作:支持多语言的交互
3.2自定义bean对象实现序列化接口
- 必须实现Writeable接口
- 反序列化时,需要反射调用空参构造函数,必须要有空参构造
public Bean(){
}
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}
@Override
public void readFields(DataInput in) throws IOException {
upFlow = in.readLong();
downFlow = in.readLong();
sumFlow = in.readLong();
}
- 序列化和反序列化的顺序完全一致
- 如果要把文件显示在文件中,需要重写toString(),可以用"\t"分隔
- 如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce中的Shuffle过程要求对key必须能排序
@Override
public int compareto(FlowBean o) {
// 倒序排列,从大到小
return this.sumFlow > o.getSumFlow() ? -1 : 1;
}