千家信息网

hadoop-common中WritableUtils的示例代码

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章将为大家详细讲解有关 hadoop-common中WritableUtils的示例代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。hadoop将java的
千家信息网最后更新 2025年02月03日hadoop-common中WritableUtils的示例代码

这篇文章将为大家详细讲解有关 hadoop-common中WritableUtils的示例代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

hadoop将java的基本类型进行封装,对整型进行编码时,分为固定长度格式、可变长度格式。可变长度格式使用一种比较灵活的编码方式,对与较小的数(尤其是负数)可以节省空间存储。

VIntWritable
public class VIntWritable implements WritableComparable {  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的示例代码"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0