這篇文章將為大家詳細講解有關 hadoop-common中WritableUtils的示例代碼,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)公司成都網(wǎng)站建設按需求定制開發(fā),是成都網(wǎng)站制作公司,為成都加固提供網(wǎng)站建設服務,有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設計服務:原型圖制作、網(wǎng)站創(chuàng)意設計、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站設計熱線:18982081108
hadoop將java的基本類型進行封裝,對整型進行編碼時,分為固定長度格式、可變長度格式??勺冮L度格式使用一種比較靈活的編碼方式,對與較小的數(shù)(尤其是負數(shù))可以節(jié)省空間存儲。
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); } }
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)); } }
如果i在 [-112 ~ 127] 之間,直接轉(zhuǎn)換為byte類型存儲。
如果i小于-112時,將其轉(zhuǎn)換成正數(shù)(異或-1L),將標識量len 設置-120;否則len為-112
移位要存儲的數(shù)據(jù),同時len進行自減(len即做了標示量,又統(tǒng)計了移位次數(shù))。
將標識量寫到輸出流。
重置len,將len設置為移位個數(shù)。
進行循環(huán),將數(shù)據(jù)每8位寫到輸出流(大端模式),具體分析for循環(huán)。
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); }
讀取一個byte類型
判斷讀出數(shù)據(jù)如果大于-112,說明不是標志量,可以直接返回原始數(shù)據(jù),如果小于-120或者在[-112 ~ -120]之間,說明為標識量,需要判斷返回移動位數(shù)。
通過得到移動的位數(shù),每次移動8位,異或移位。還原數(shù)據(jù)。
判斷表示量,如果在小于-120 或者在[0 ~ -112]之間,證明是負數(shù),將得到的數(shù)據(jù)進行異或-1L得到最終值。
關于“ hadoop-common中WritableUtils的示例代碼”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
網(wǎng)頁名稱:hadoop-common中WritableUtils的示例代碼
轉(zhuǎn)載注明:http://jinyejixie.com/article22/jpdijc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設、網(wǎng)站制作、Google、關鍵詞優(yōu)化、電子商務、營銷型網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)