java—在hadoop中,哪种数据结构最好在map输出值中包含多个类型?

jc3wubiy  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(244)

我编写了一个map reduce程序,其值格式为:

Integer@BitSet

我想减小随机播放的大小。用起来好吗

Vector<Object> vec=new Vector();
vec.add(Integer);
vec.add(BitSet);

这个向量大吗?在我的例子中哪个数据结构是最好的?

0dxa2lsx

0dxa2lsx1#

两者 BitSet 以及 Integers 延伸自 Object .
所以你的例子会有用。
这个 Vector 因此它会导致性能下降。
我会用 ArrayList 接口。

List<Object> bb = new ArrayList<Object>();
bb.add(new Integer(3));
bb.add(new BitSet(5));

我看不到任何共同点,只看到物体。
使用单个类作为结构的另一种方法,

public class Struct{
   private Integer mInt;
   private BitSet mBitSet;
}

...
Struct struct;
List<Struct> bb = new ArrayList<Struct>();
struct = new Struct(new Integer(3));
bb.add(struct);
struct = new Struct(new BitSet(5));
bb.add(struct);

....
w9apscun

w9apscun2#

如果您想减少无序大小,一个很好的最小化它的方法是实现一个定制的可写类。hadoop处理奇怪类型的序列化有时会有相当大的开销,因此定制的可写类型提供了完全的控制,您还可以利用“原始”可写类型,这是非常有效的。你可以这样做:

public class IntAndBitSetWritable implements Writable {

    private IntWritable n;
    private BytesWritable bytes;

    @Override
    public void readFields(DataInput in) throws IOException {
        n.readFields(in);
        bytes.readFields(in);
    }

    @Override
    public void write(DataOutput out) throws IOException {
        n.write(out);
        bytes.write(out);
    }

    public BitSet getBitSet() {
        return BitSet.valueOf(bytes.getBytes());
    }

    public int getInt() {
        return n.get();
    }

    public void setBitSet(BitSet b) {
        byte[] arr = b.toByteArray();
        bytes.setSize(arr.length);
        bytes.set(arr, 0, arr.length);
    }

    public void setInt(int i) {
        n.set(i);
    }

}

注意,上面假设使用Java7来转换 BitSet 收件人/发件人 byte[] . 如果使用Java6,可能需要实现不同的转换方法。

相关问题