hadoop AbstractMapWritable及其实现类是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
10年的秀洲网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整秀洲建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“秀洲网站设计”,“秀洲网站推广”以来,每个客户项目都认真落实执行。
AbstractMapWritable作为抽象的Map容器Writable类型,主要是为其实现类MapWritable和SortedMapWritable提供出一套索引表的结构,如下:
MapclassToIdMap = new ConcurrentHashMap () //id到Class的映射表 Map idToClassMap = new ConcurrentHashMap (), //class到Id的映射表
索引表需要添加新的class对象和Id映射关系,势必需要一个新的Id变量,class对象则作为方法形参,如下
private volatile byte newClasses = 0;
有了上面的数据结构,则需要增加一些数据的操作方法,既然AbstractMapWritable基本的数据结构是关于索引表的,自然的会有索引的添加
private synchronized void addToMap(Class clazz, byte id) { //主要实现功能为对索引id通过两个索引表操作是否存在已存在,索引Id存在但不为形参id则抛异常,否则加入索引信息 } protected synchronized void addToMap(Class clazz) { //不存在索引id,且当前索引变量newClasses<127则自动加入索引信息 if (classToIdMap.containsKey(clazz)) { return; } if (newClasses + 1 > Byte.MAX_VALUE) { throw new IndexOutOfBoundsException("adding an additional class would" + " exceed the maximum number allowed"); } byte id = ++newClasses; addToMap(clazz, id); }
AbstractMapWritable提供了一个受保护的构造函数
protected AbstractMapWritable() { this.conf = new AtomicReference(); //添加基础序列化类型的索引信息,索引表能表示的范围只有-127~128种类型 addToMap(ArrayWritable.class, Byte.valueOf(Integer.valueOf(-127).byteValue())); addToMap(BooleanWritable.class, Byte.valueOf(Integer.valueOf(-126).byteValue())); addToMap(BytesWritable.class, Byte.valueOf(Integer.valueOf(-125).byteValue())); addToMap(FloatWritable.class, Byte.valueOf(Integer.valueOf(-124).byteValue())); addToMap(IntWritable.class, Byte.valueOf(Integer.valueOf(-123).byteValue())); addToMap(LongWritable.class, Byte.valueOf(Integer.valueOf(-122).byteValue())); addToMap(MapWritable.class, Byte.valueOf(Integer.valueOf(-121).byteValue())); addToMap(MD5Hash.class, Byte.valueOf(Integer.valueOf(-120).byteValue())); addToMap(NullWritable.class, Byte.valueOf(Integer.valueOf(-119).byteValue())); addToMap(ObjectWritable.class, Byte.valueOf(Integer.valueOf(-118).byteValue())); addToMap(SortedMapWritable.class, Byte.valueOf(Integer.valueOf(-117).byteValue())); addToMap(Text.class, Byte.valueOf(Integer.valueOf(-116).byteValue())); addToMap(TwoDArrayWritable.class, Byte.valueOf(Integer.valueOf(-115).byteValue())); // UTF8 is deprecated so we don't support it addToMap(VIntWritable.class, Byte.valueOf(Integer.valueOf(-114).byteValue())); addToMap(VLongWritable.class, Byte.valueOf(Integer.valueOf(-113).byteValue())); }
紧接着的是序列化和反序列化方法
序列化:将索引信息写流中
//序列化方法首先写入的是当前索引变量newClasses,然后依次从索引Id范围[1,newClasss]依次写入索引Id+类名的组合 public void write(DataOutput out) throws IOException { // First write out the size of the class table and any classes that are // "unknown" classes //写入索引ID out.writeByte(newClasses); /* **不明白为什么只是写入部分[1~newClasses]的索引信息,而非[-127~newClasses的索引信息], **猜想可能与子类覆盖其受保护的构造函数有关,因为newClasses默认初始为0 **/ for (byte i = 1; i <= newClasses; i++) { out.writeByte(i); out.writeUTF(getClass(i).getName()); } }
反序列化:从流中构造出索引信息
//主要是根据序列化的结构从流中构造索引信息 public void readFields(DataInput in) throws IOException { // Get the number of "unknown" classes newClasses = in.readByte(); // Then read in the class names and add them to our tables for (int i = 0; i < newClasses; i++) { byte id = in.readByte(); String className = in.readUTF(); try { //索引信息构造 addToMap(Class.forName(className), id); } catch (ClassNotFoundException e) { throw new IOException("can't find class: " + className + " because "+ e.getMessage()); } } }
AbstractMapWritable作为MapWritable抽象类并没有涉及到Map
//MapWritable构造函数 public MapWritable() { super(); this.instance = new HashMap(); } //SortedMapWritable构造函数 public SortedMapWritable() { super(); this.instance = new TreeMap (); }
对于新增的成员Map
序列化:先调用AbstractMapWritable的序列化方法,在对Map
//MapWritable的序列化方法 public void write(DataOutput out) throws IOException { super.write(out); // Write out the number of entries in the map out.writeInt(instance.size()); // Then write out each key/value pair for (Map.Entrye: instance.entrySet()) { out.writeByte(getId(e.getKey().getClass())); e.getKey().write(out); out.writeByte(getId(e.getValue().getClass())); e.getValue().write(out); } }
反序列化:则按照上诉的结构从流中构造出索引表和Writable对象。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。