溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hadoop-common中WritableUtils的示例代碼

發布時間:2021-12-09 15:22:39 來源:億速云 閱讀:177 作者:小新 欄目:云計算

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

hadoop將java的基本類型進行封裝,對整型進行編碼時,分為固定長度格式、可變長度格式??勺冮L度格式使用一種比較靈活的編碼方式,對與較小的數(尤其是負數)可以節省空間存儲。

VIntWritable
public class VIntWritable implements WritableComparable<VIntWritable> {
  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] 之間,直接轉換為byte類型存儲。

  2. 如果i小于-112時,將其轉換成正數(異或-1L),將標識量len 設置-120;否則len為-112

  3. 移位要存儲的數據,同時len進行自減(len即做了標示量,又統計了移位次數)。

  4. 將標識量寫到輸出流。

  5. 重置len,將len設置為移位個數。

  6. 進行循環,將數據每8位寫到輸出流(大端模式),具體分析for循環。

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. 讀取一個byte類型

  2. 判斷讀出數據如果大于-112,說明不是標志量,可以直接返回原始數據,如果小于-120或者在[-112 ~ -120]之間,說明為標識量,需要判斷返回移動位數。

  3. 通過得到移動的位數,每次移動8位,異或移位。還原數據。

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

關于“ hadoop-common中WritableUtils的示例代碼”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女