如何在hadoop中使用位字符串?

uelo1irk  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(233)

我正在用java写一个程序。我的密钥是可写的,值是位字符串0,1。位字符串的大小可以是1000000(由0或1组成)。我必须使用哪种类型的数据占用最少的空间?谢谢。

6ie5vjzr

6ie5vjzr1#

你可以使用 java.util.BitSet 把你的比特压缩成长的,从而得到某种压缩。在上面提到的1024位的情况下,您可以使用1024/64=16 long对数据进行编码,这些long占用8个字节,因此总共只使用128个字节。
实施 Writable 必须实现相同的被调用接口:

public class BitSetWritable implements Writable {

  private BitSet set;

  public BitSetWritable() {
    // default constructor
  }

  public BitSetWritable(BitSet set) {
    this.set = set;
  }
  [...]
}

我在这里添加了一些方便的构造器,注意默认构造器是hadoop序列化机制的必备工具。
实现接口后,您将被迫实现两种方法: readFields 以及 write :

@Override
  public void write(DataOutput out) throws IOException {
    long[] longs = set.toLongArray();
    out.writeInt(longs.length);
    for (int i = 0; i < longs.length; i++) {
      out.writeLong(longs[i]);
    }
  }

  @Override
  public void readFields(DataInput in) throws IOException {
    long[] longs = new long[in.readInt()];
    for (int i = 0; i < longs.length; i++) {
      longs[i] = in.readLong();
    }

    set = BitSet.valueOf(longs);
  }

这是非常直接的,你写在集合中分配的long数(只有4字节的开销),然后写位集合的long值。当你回读的时候,你也会做同样的事情。
如果您想直接复制,我已将完整文件和测试用例添加到github上的库中:
https://github.com/thomasjungblut/thomasjungblut-common/blob/master/src/de/jungblut/writable/bitsetwritable.java
https://github.com/thomasjungblut/thomasjungblut-common/blob/master/test/de/jungblut/writable/bitsetwritabletest.java

相关问题