对于定长格式和变长格式:
对整数进行编码时,有两种选择,即定长格式(IntWritbale和LongWritable)和变长格式(VIntWritable 和 VLongWritable).需要编码的数值如果想当小(在127和-127之间,包括-127和127之间 ),变长格式就是只用一个字节进行编码;否则使用第一个字节便是数值的正负和后跟多少个字节。
如何选择?
定长格式编码很适合数值在整个值域中非常均匀的情况,例如使用精心设计的哈希函数。然而,大多数数值变量分布不均匀,一般而言变长格式更加节省空间。变长格式的另一有点就是可以在VIntWritable和LongWritable之间转化,因为他们的编码实际上是一致的。所以选择变长更加省空间,不必开始就是8字节的long表示。
测试:
对整数168 使用IntWritable和VIntritable进行比较
package day20190721;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.VIntWritable;
public class test01 {
public static void main(String[] args) throws Exception {
ByteArrayOutputStream out=new ByteArrayOutputStream();
DataOutputStream dataOutputStream=new DataOutputStream(out);
IntWritable i=new IntWritable(168);
i.write(dataOutputStream);
dataOutputStream.close();
System.out.println("定长:"+out.toByteArray().length);
System.out.println(".......................");
//IntWritable
VIntWritable vi=new VIntWritable(168);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
DataOutputStream dos=new DataOutputStream(bos);
vi.write(dos);
System.out.println("变长:"+bos.toByteArray().length);
dos.close();
}
}
输出结果比较: