hadoop-common源码分析之-WritableUtils,hadoopcommon源码
hadoop-common源码分析之-WritableUtils,hadoopcommon源码
hadoop将java的基本类型进行封装,对整型进行编码时,分为固定长度格式、可变长度格式。可变长度格式使用一种比较灵活的编码方式,对与较小的数(尤其是负数)可以节省空间存储。
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));
}
}
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);
}
总结:
版权声明:本文为博主原创文章,未经博主允许不得转载。
评论暂时关闭