Hadoop的MapReduce计算模型的Key,Value值都是采用的自定义Writable类型,我们也可以自定义Writable来实现不同的业务需求。

  1.定义:

    a.基于DataInput和DataOutput实现简单,高效,序列协议的可序列化对象;

    b.在hadoop的MapReduce计算编程模型中,必须实现Writable接口

    c.实现通常实现静态read(DataInput)方法,该方法构造一个新的实例,调用readFields(DataInput)并返回实例。

  2.接口说明

    public interface Writable {

      /**
      * 序列化对象的field(字段)到DataOutput中
      * (序列化过程)
      */
      void write(DataOutput out) throws IOException;

      /**
      * 从DataInput中将对象的field(字段)反序列化
      *(反序列化的过程)
      */
      void readFields(DataInput in) throws IOException;
    }

  与java的区别:

    java序列户过程是面向流的;hadoop中Writable序列化面向对象的;

  3.序列化过程

    

    public static byte[] serialize(Writable writable) throws IOException {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      DataOutputStream dataOut = new DataOutputStream(out);
      writable.write(dataOut);
      dataOut.close();

    }

4.反序列化过程:
  public static byte[] deserialize(Writable writable, byte[] bytes)throws IOException {
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    DataInputStream dataIn = new DataInputStream(in);
    writable.readFields(dataIn);
    dataIn.close();
    return bytes;
  }

分析序列化和反序列化的过程
------------------------------------------------
0.结合MapWritable、IntWritable和Text跟踪底层源码
1.构建MapWritable:
MapWritable _map = new MapWritable();
_map.put(new IntWritable(12), new Text("zhangsan"));
_map.put(new IntWritable(130), new Text("lisi"));
_map.put(new IntWritable(16), new Text("hanmeimei"));
_map.put(new IntWritable(7778878), new Text("lilei"));
2.序列化mapWritable对象,调用serialize(Writable writable)
//序列化过程,调用writable的write()
byte[] tt = serialize(_map);
System.out.println(tt.length);
说明:【MapWritable.class】-->write(DataOutput out)方法
public void write(DataOutput out) throws IOException {
super.write(out); 【说明:调用AbstractMapWritable.class的write()方法:将newclass添加至out中】
// Write out the number of entries in the map
out.writeInt(instance.size()); 【说明:将mapwritable对象的个数写入到out中】
// Then write out each key/value pair 【说明:循环遍历,写入顺序为:KeyClassID+key+ValueClassID+value】
for (Map.Entry<Writable, Writable> e: instance.entrySet()) {
out.writeByte(getId(e.getKey().getClass()));
e.getKey().write(out);
out.writeByte(getId(e.getValue().getClass()));
e.getValue().write(out);
}
}
3.反序列化,定义新的mapWritable对象,调用deserialize(Writable writable, byte[] bytes)
MapWritable map2 = new MapWritable();
deserialize(map2, tt);
System.out.println(map2.size());
说明:【MapWritable.class】-->readFields(DataInput in)方法
public void readFields(DataInput in) throws IOException {
super.readFields(in); 【说明:调用AbstractMapWritable.class的readFields()方法:获取newclass的类型】
// First clear the map. Otherwise we will just accumulate
// entries every time this method is called.
this.instance.clear(); 【说明:清空map对象中的数据】
// Read the number of entries in the map
int entries = in.readInt(); 【说明:通过in读取一个int(整型位)获得序列化中数据的个数】
// Then read each key/value pair 【说明:循环遍历个数,利用反射机制获取keyclass和valueclass,并通过Writable的readFields方法读取key值和value值,并将其写入至instance(当前MapWritable对象中)】
for (int i = 0; i < entries; i++) {
Writable key = (Writable) ReflectionUtils.newInstance(getClass(in.readByte()), getConf());
key.readFields(in);
Writable value = (Writable) ReflectionUtils.newInstance(getClass(in.readByte()), getConf());
value.readFields(in);
instance.put(key, value);
}
}

  

转载于:https://www.cnblogs.com/lyr999736/p/9381637.html

自定义Writable类型相关推荐

  1. 自定义的类型转换器中怎样自定义错误消息?(待解答)

    1.HTTP没有"类型"的概念,每一项表单输入只可能是一个字符串或一个字符串数组.从HTML表单到服务器端,必须把String转换为特定的数据类型. 2.字符串和基本数据类型之间的 ...

  2. R语言使用R原生函数plot和lines可视化线图、并使用lty参数自定义线条类型、lwd自定义设置线条的粗细、col参数自定义线条颜色(Change R base plot line types)

    R语言使用R原生函数plot和lines可视化线图.并使用lty参数自定义线条类型.lwd自定义设置线条的粗细.col参数自定义线条颜色(Change R base plot line types) ...

  3. SAP MM 自定义条件类型出现在采购信息记录的'条件'界面里 ?

    SAP MM 自定义条件类型出现在采购信息记录的'条件'界面里 ? 我在SAP系统里复制某个标准的采购条件类型,创建了一个新的自定义条件类型ZC05,并将其分配采购定价过程RM0000. 结果却出现一 ...

  4. 【SAP技术】SAP MM 如何看一个自定义移动类型是复制哪个标准移动类型而创建的?

    [SAP技术]SAP MM 如何看一个自定义移动类型是复制哪个标准移动类型而创建的? 比如项目上有一个自定义移动类型Z59,是复制551移动类型而定义的. OMJJ配置界面里,是有一个Ref字段.如下 ...

  5. 编写MOSS自定义字段类型的小意外

    这段时间手头要做一个KM系统,在发表新知识文章时需要选择一个或多个维度下的知识分类.其实实现方法有很多,例如说再做一个专门用于设置知识分类的页面,让了发表完知识时或者在了表知识前让用户选择:又或者扩展 ...

  6. 自定义MIME类型支持FLV的相关设置

    网络空间支持FLV的相关设置其实很简单,就是自定义一个MIME类型 一般虚拟主机管理里面都有这个选项 自定义MIME类型 扩展名: .flv MIME类型: flv-application/octet ...

  7. 自定义字段类型的开发[转]

    自定义字段类型的开发--2级联动Combox 在网上找了一些关于自定义字段类型开发的文章.发现在MOSS开发中关于这一部分的文章很少.不过这些也够我们入门了. 1,创建MOSS2007自定义字段类型实 ...

  8. Sharepoint 自定义字段类型

    Moss2007默认有许多常见类型,如:文本,日期,数字,选项- ,有时我们需要根据需求自定义一个类型!在WSS3.0中可以通过C#或者VB来编写扩展字段,所有的自动需要继承内置的Sharepoint ...

  9. 自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧

    一:背景 1. 讲故事 曾今在项目中发现有同事自定义结构体的时候,居然没有重写Equals方法,比如下面这段代码: static void Main(string[] args){var list = ...

最新文章

  1. 解决类似umount target is busy挂载盘卸载不掉问题
  2. MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App
  3. tomcat7实战调优笔记
  4. LeetCode Median of Two Sorted Arrays (DFS)
  5. Microsfot.Web.UI.WebControls.TreeView JavaScript控制方法研究(转)
  6. MM中如何更改物料的评估类
  7. Azure恢复服务-DPM联机备份SQL数据库
  8. 解决Silverlight中DataGrid在显示数据时多一空白列
  9. alwayson高可用组_AlwaysOn可用性组–好奇心使您的工作更轻松–第2部分
  10. JS学习总结(12)——Math对象/时间对象
  11. 为Druid监控配置访问权限(配置访问监控信息的用户与密码)
  12. eclipse插件开发总结
  13. kali linux nmap命令的使用
  14. boost升压斩波电路 分析
  15. 12.2.1 QTcpSocket类介绍
  16. PM2.5数据的清洗,汇总与制作散点图(含源数据链接)
  17. 夕阳红旅游团第三周报告
  18. React 之导入 Excel
  19. pdfbox 去除签名 保留签名图片
  20. zzuli:1102火车票退票费计算(函数专题)

热门文章

  1. SqlServer标识列
  2. [转]学会使用DB2指令
  3. python读取文件时提示“UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 1264: illegal multi
  4. awk之printf及相关参数详解
  5. Linux 各种压缩类型文件 解压命令 整理 tar.bz2 tar.gz tgz等等
  6. vi/vim的使用方法及常用的快捷键--vimer们的福音
  7. 设计模式08_适配器
  8. 从数据仓库到大数据平台再到数据中台(内附13张架构图)
  9. 写给数据分析小白:一种通用的数据思维
  10. 太原市初中计算机课程视频,初中全课程教学视频