A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我是楠楠 于 2018-9-3 14:46 编辑

【郑州校区】大数据离线阶段Day4之MapReduce的序列化

1. 概述
序列化(Serialization)是指把结构化对象转化为字节流。
反序列化(Deserialization)是序列化的逆过程。把字节流转为结构化对象。
当要在进程间传递对象或持久化对象的时候,就需要序列化对象成字节流,反之当要将接收到或从磁盘读取的字节流转换为对象,就要进行反序列化。
Java的序列化(Serializable)是一个重量级序列化框架,一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系…),不便于在网络中高效传输;所以,hadoop自己开发了一套序列化机制(Writable),精简,高效。不用像java对象类一样传输多层的父子关系,需要哪个属性就传输哪个属性值,大大的减少网络传输的开销。
Writable是Hadoop的序列化格式,hadoop定义了这样一个Writable接口。
一个类要支持可序列化只需实现这个接口即可。
1. public interface Writable {  
2.   void write(DataOutput out) throws IOException;  
3.   void readFields(DataInput in) throws IOException;  
4. }
2. Writable序列化接口
如需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序,此时,自定义的bean实现的接口应该是:
public  class  FlowBean  implements  WritableComparable<FlowBean>
需要自己实现的方法是:
[AppleScript] 纯文本查看 复制代码
/**

 * 反序列化的方法,反序列化时,从流中读取到的各个字段的顺序应该与序列化时写出去的顺序保持一致

 */

@Override

public void readFields(DataInput in) throws IOException {


upflow = in.readLong();

dflow = in.readLong();

sumflow = in.readLong();


}

/**

 * 序列化的方法

 */

@Override

public void write(DataOutput out) throws IOException {

 

out.writeLong(upflow);

out.writeLong(dflow);

out.writeLong(sumflow);

}


@Override

public int compareTo(FlowBean o) {


//实现按照sumflow的大小倒序排序

return sumflow>o.getSumflow()?-1:1;

}
compareTo方法用于将当前对象与方法的参数进行比较。
如果指定的数与参数相等返回0。
如果指定的数小于参数返回 -1。
如果指定的数大于参数返回 1。
例如:o1.compareTo(o2);
返回正数的话,当前对象(调用compareTo方法的对象o1)要排在比较对象(compareTo传参对象o2)后面,返回负数的话,放在前面。
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马