真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

hadoopAbstractMapWritable及其實(shí)現(xiàn)類是怎樣的

hadoop AbstractMapWritable及其實(shí)現(xiàn)類是怎樣的,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

10年的秀洲網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整秀洲建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“秀洲網(wǎng)站設(shè)計(jì)”,“秀洲網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

     AbstractMapWritable作為抽象的Map容器Writable類型,主要是為其實(shí)現(xiàn)類MapWritable和SortedMapWritable提供出一套索引表的結(jié)構(gòu),如下:

Map classToIdMap = new ConcurrentHashMap()     //id到Class的映射表
Map idToClassMap = new ConcurrentHashMap(),   //class到Id的映射表

索引表需要添加新的class對(duì)象和Id映射關(guān)系,勢必需要一個(gè)新的Id變量,class對(duì)象則作為方法形參,如下

 private volatile byte newClasses = 0;

有了上面的數(shù)據(jù)結(jié)構(gòu),則需要增加一些數(shù)據(jù)的操作方法,既然AbstractMapWritable基本的數(shù)據(jù)結(jié)構(gòu)是關(guān)于索引表的,自然的會(huì)有索引的添加

private synchronized void addToMap(Class clazz, byte id) {
  //主要實(shí)現(xiàn)功能為對(duì)索引id通過兩個(gè)索引表操作是否存在已存在,索引Id存在但不為形參id則拋異常,否則加入索引信息
}
protected synchronized void addToMap(Class clazz) {
   //不存在索引id,且當(dāng)前索引變量newClasses<127則自動(dòng)加入索引信息 
  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提供了一個(gè)受保護(hù)的構(gòu)造函數(shù)

  protected AbstractMapWritable() {
    this.conf = new AtomicReference();
    
    //添加基礎(chǔ)序列化類型的索引信息,索引表能表示的范圍只有-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()));
}

緊接著的是序列化和反序列化方法

序列化:將索引信息寫流中

//序列化方法首先寫入的是當(dāng)前索引變量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的索引信息],
    **猜想可能與子類覆蓋其受保護(hù)的構(gòu)造函數(shù)有關(guān),因?yàn)閚ewClasses默認(rèn)初始為0
    **/
    for (byte i = 1; i <= newClasses; i++) {
      out.writeByte(i);
      out.writeUTF(getClass(i).getName());
    }
  }

反序列化:從流中構(gòu)造出索引信息

  //主要是根據(jù)序列化的結(jié)構(gòu)從流中構(gòu)造索引信息
  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 {
      //索引信息構(gòu)造
        addToMap(Class.forName(className), id);
        
      } catch (ClassNotFoundException e) {
        throw new IOException("can't find class: " + className + " because "+
            e.getMessage());
      }
    }
  }

AbstractMapWritable作為MapWritable抽象類并沒有涉及到Map的鍵值對(duì)操作,而是從抽象層抽象出索引表,其實(shí)現(xiàn)類MapWritable和SortedMapWritable則是新增了Map變量,不同的之處在于SortedMapWritable是實(shí)現(xiàn)了排序了的TreeMap,自身已具有排序功能。

 //MapWritable構(gòu)造函數(shù)
 public MapWritable() {
    super();
    this.instance = new HashMap();
  }
  //SortedMapWritable構(gòu)造函數(shù)
  public SortedMapWritable() {
    super();
    this.instance = new TreeMap();
  }

對(duì)于新增的成員Map自然需要具備一些方法,基本上跟java的map(這里需要維護(hù)索引表)方法無異,但對(duì)于序列化和反序列化則是在其抽象類的基礎(chǔ)上擴(kuò)展,具體如下

序列化:先調(diào)用AbstractMapWritable的序列化方法,在對(duì)Map的容量序列化,接著對(duì)key和value一一序列化

//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.Entry e: instance.entrySet()) {
      out.writeByte(getId(e.getKey().getClass()));
      e.getKey().write(out);
      out.writeByte(getId(e.getValue().getClass()));
      e.getValue().write(out);
    }
  }

反序列化:則按照上訴的結(jié)構(gòu)從流中構(gòu)造出索引表和Writable對(duì)象。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


當(dāng)前文章:hadoopAbstractMapWritable及其實(shí)現(xiàn)類是怎樣的
當(dāng)前鏈接:http://weahome.cn/article/pgpdsi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部