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

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

hadoop-common中WritableUtils的示例代碼

這篇文章將為大家詳細(xì)講解有關(guān) hadoop-common中WritableUtils的示例代碼,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)公司成都網(wǎng)站建設(shè)按需求定制開(kāi)發(fā),是成都網(wǎng)站制作公司,為成都加固提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站設(shè)計(jì)熱線:18982081108

hadoop將java的基本類型進(jìn)行封裝,對(duì)整型進(jìn)行編碼時(shí),分為固定長(zhǎng)度格式、可變長(zhǎng)度格式。可變長(zhǎng)度格式使用一種比較靈活的編碼方式,對(duì)與較小的數(shù)(尤其是負(fù)數(shù))可以節(jié)省空間存儲(chǔ)。

VIntWritable
public class VIntWritable implements WritableComparable {
  private int value;//getter //setter
  @Override
  public void readFields(DataInput in) throws IOException {
    value = WritableUtils.readVInt(in);
  }  @Override
  public void write(DataOutput out) throws IOException {
    WritableUtils.writeVInt(out, value);
  }

}
WritableUtils.writeVLong
  public static void writeVInt(DataOutput stream, int i) throws IOException {
    writeVLong(stream, i);
  }  public static void writeVLong(DataOutput stream, long i) throws IOException {if (i >= -112 && i <= 127) {
      stream.writeByte((byte)i);      return;
    }int len = -112;if (i < 0) {
      i ^= -1L; // take one's complement'  len = -120;
    }long tmp = i;while (tmp != 0) {
      tmp = tmp >> 8;
      len--;
    }

    stream.writeByte((byte)len);

    len = (len < -120) ? -(len + 120) : -(len + 112);for (int idx = len; idx != 0; idx--) {      int shiftbits = (idx - 1) * 8;      long mask = 0xFFL << shiftbits;
      System.out.println(((i & mask) >> shiftbits));
      stream.writeByte((byte)((i & mask) >> shiftbits));
    }
  }
  1. 如果i在 [-112 ~ 127] 之間,直接轉(zhuǎn)換為byte類型存儲(chǔ)。

  2. 如果i小于-112時(shí),將其轉(zhuǎn)換成正數(shù)(異或-1L),將標(biāo)識(shí)量len 設(shè)置-120;否則len為-112

  3. 移位要存儲(chǔ)的數(shù)據(jù),同時(shí)len進(jìn)行自減(len即做了標(biāo)示量,又統(tǒng)計(jì)了移位次數(shù))。

  4. 將標(biāo)識(shí)量寫(xiě)到輸出流。

  5. 重置len,將len設(shè)置為移位個(gè)數(shù)。

  6. 進(jìn)行循環(huán),將數(shù)據(jù)每8位寫(xiě)到輸出流(大端模式),具體分析for循環(huán)。

WritableUtils.readVLong
  public static long readVLong(DataInput stream) throws IOException {byte firstByte = stream.readByte();int len = decodeVIntSize(firstByte);if (len == 1) {      return firstByte;
    }long i = 0;for (int idx = 0; idx < len-1; idx++) {      byte b = stream.readByte();
      i = i << 8;
      i = i | (b & 0xFF);
    }return (isNegativeVInt(firstByte) ? (i ^ -1L) : i);
  }  public static int decodeVIntSize(byte value) {if (value >= -112) {      return 1;
    } else if (value < -120) {      return -119 - value;
    }return -111 - value;
  } 
  public static boolean isNegativeVInt(byte value) {return value < -120 || (value >= -112 && value < 0);
  }
  1. 讀取一個(gè)byte類型

  2. 判斷讀出數(shù)據(jù)如果大于-112,說(shuō)明不是標(biāo)志量,可以直接返回原始數(shù)據(jù),如果小于-120或者在[-112 ~ -120]之間,說(shuō)明為標(biāo)識(shí)量,需要判斷返回移動(dòng)位數(shù)。

  3. 通過(guò)得到移動(dòng)的位數(shù),每次移動(dòng)8位,異或移位。還原數(shù)據(jù)。

  4. 判斷表示量,如果在小于-120 或者在[0 ~ -112]之間,證明是負(fù)數(shù),將得到的數(shù)據(jù)進(jìn)行異或-1L得到最終值。

關(guān)于“ hadoop-common中WritableUtils的示例代碼”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


本文題目:hadoop-common中WritableUtils的示例代碼
分享路徑:http://weahome.cn/article/jpdijc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部