hadoop 中对java的基本类型进行了writeable的封装,并且所有这些writeable都是继承自WritableComparable的,都是可比较的;并且,它们都有对应的get() 和 set()方法,

其中对整型(int 和 long)进行编码的时候,有固定长度格式(intWritable和LongWritable)和可变长度格式(VIntWritable 和 VLongWritable),其中VIntWritable和VLongWritable的编码规则是一样的,

所以VIntWritable的输出可以用VLongWritable读入。其实在VIntWritable的write(DataOUtput out) 与 readFields(DataInput in)中分别调用的是WritableUtils.writeVint(out)和WritableUtils.readVint(int),

而writeVint()和readVint()方法也只是简单的调用了writeVLong和readVLong方法。通过writeVInt()写入的数据自然可以通过readVLong()来进行读人;编码规则如下:

其基本思想  主要思想是大的负数的压缩 ,先反码操作,将负数取反,负数一旦取反,前面的字节就有可能变零了。 然后没八位一组截取成 一个字节

写入

  1. public static void writeVLong(DataOutput stream, long i) throws IOException {
  2. // 如果在一个字节可以表示的范围内 直接返回
  3. if (i >= -112 && i <= 127) {
  4. stream.writeByte((byte)i);
  5. return;
  6. }
  7. //把负数变成正数
  8. int len = -112;
  9. if (i < 0) {
  10. i ^= -1L; // take one's complement'
  11. len = -120;
  12. }
  13. //判断正数有几个位数 通过右移实现
  14. long tmp = i;
  15. while (tmp != 0) {
  16. tmp = tmp >> 8;
  17. len--;
  18. }
  19. // 写入第一个字节 该字节标识 这个数十正数还是负数 以及接下来有几个字节属于这个数
  20. stream.writeByte((byte)len);
  21. // 判断需要几个字节表示该数
  22. len = (len < -120) ? -(len + 120) : -(len + 112);
  23. //以每八位一组截取 成一个字节
  24. for (int idx = len; idx != 0; idx--) {
  25. int shiftbits = (idx - 1) * 8;
  26. long mask = 0xFFL << shiftbits;
  27. stream.writeByte((byte)((i & mask) >> shiftbits));
  28. }
  29. }

读取

  1. public static long readVLong(byte[] bytes, int start) throws IOException {
  2. int len = bytes[start];
  3. if (len >= -112) {
  4. return len;
  5. }
  6. boolean isNegative = (len < -120);
  7. len = isNegative ? -(len + 120) : -(len + 112);
  8. if (start+1+len>bytes.length)
  9. throw new IOException(
  10. "Not enough number of bytes for a zero-compressed integer");
  11. long i = 0;
  12. for (int idx = 0; idx < len; idx++) {
  13. i = i << 8;
  14. i = i | (bytes[start+1+idx] & 0xFF);
  15. }
  16. return (isNegative ? (i ^ -1L) : i);
  17. }

hadoop 中对Vlong 和 Vint的压缩方法的更多相关文章

  1. Hadoop中操作HDFS出现异常的解决方法

    Hadoop环境搭建成功后,一般会运行一个小例子,这时候就涉及到了对HDFS文件系统的操作,对于刚开始学习Hadoop的初学者一般会多次的进行name节点的格式化操作,最后导致上传文件会抛出异常,通过 ...

  2. Hadoop中配置环境后重启失效解决方法

    Ubuntu下设置环境变量有三种方法,一种用于当前终端,一种用于当前用户,一种用于所有用户: 一:用于当前终端: 在当前终端中输入:export PATH=$PATH:<路径> 不过上面的 ...

  3. [转] - hadoop中使用lzo的压缩

    在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理.这样的特点,就可以让l ...

  4. hadoop中MapReduce中压缩的使用及4种压缩格式的特征的比较

    在比较四中压缩方法之前,先来点干的,说一下在MapReduce的job中怎么使用压缩. MapReduce的压缩分为map端输出内容的压缩和reduce端输出的压缩,配置很简单,只要在作业的conf中 ...

  5. [大牛翻译系列]Hadoop(20)附录A.10 压缩格式LZOP编译安装配置

    附录A.10 LZOP LZOP是一种压缩解码器,在MapReduce中可以支持可分块的压缩.第5章中有一节介绍了如何应用LZOP.在这一节中,将介绍如何编译LZOP,在集群做相应配置. A.10.1 ...

  6. 浅谈hadoop中mapreduce的文件分发

    近期在做数据分析的时候.须要在mapreduce中调用c语言写的接口.此时就须要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后 ...

  7. 开启hadoop和Hbase集群的lzo压缩功能(转)

    原文链接:开启hadoop和Hbase集群的lzo压缩功能 问题导读: 1.如何启动hadoop.hbase集群的压缩功能? 2.lzo的作用是什么? 3.hadoop配置文件需要做哪些修改? 首先我 ...

  8. hadoop中的序列化与Writable接口

    本文地址:http://www.cnblogs.com/archimedes/p/hadoop-writable-interface.html,转载请注明源地址. 简介 序列化和反序列化就是结构化对象 ...

  9. Hadoop中Partition的定制

    1.解析Partition Map的结果,会通过partition分发到Reducer上,Reducer做完Reduce操作后,通过OutputFormat,进行输出,下面我们就来分析参与这个过程的类 ...

随机推荐

  1. HIbernate实现增、删、改、查。

    //大配置 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC " ...

  2. 自定义jQuery插件Step by Step

    1.1.1 摘要 随着前端和后端技术的分离,各大互联网公司对于 Mobile First理念都是趋之若鹜的,为了解决网页在不同移动设备上的显示效果,其中一个解决方案就是Responsive Desig ...

  3. javamail 学习及实例

    JavaMail,是Sun发布的用来处理email的API,提供给开发者处理电子邮件相关的编程接口.通过使用它可以方便地执行一些常用的邮件传输. 可以看下<java邮件开发详解>第四章和第 ...

  4. Oracle函数大全之转换函数

    chartorowid(c1) [功能]转换varchar2类型为rowid值 [参数]c1,字符串,长度为18的字符串,字符串必须符合rowid格式 [返回]返回rowid值 [示例] SELECT ...

  5. SVMshow

    SVMshow % http://www.peteryu.ca/tutorials/matlab/visualize_decision_boundaries % load RankData % Num ...

  6. 通过class和id获取DOM元素的区别

    1.通过id获取DOM元素的方法:document.getElementById("id名") 2.通过class获取DOM元素的方法:document.getElementsBy ...

  7. [整]常用的几种VS编程插件

    通过这些编程插件,你可以方便快捷的完成编程的各项任务,以下分别作下简单介绍,欢迎讨论交流. Visual Assist(强烈推荐)网址:http://www.wholetomato.com/功能:VA ...

  8. 源代码解读Cas实现单点登出(single sign out)功能实现原理

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  9. 使用Join代替In

    我们知道,在sql中使用IN让我们的where子句可以规定多个值.当需要从一个集合中查询包含某几个值的记录的时候,通常我们会选择使用IN来实现,其实,使用JOIN也可以实现这样的功能,而且性能要比IN ...

  10. Centos 下搭建SVN + Apache 服务器(转载)

    安装软件包 ? 1 # yum install httpd ? 1 # yum install mod_dav_svn ? 1 # yum install subversion 2.  验证安装 ? ...