哪个数据结构最好在hadoop中的Map输出值中有多个类型?

时间:2013-09-25 17:24:04

标签: java data-structures hadoop vector shuffle

我编写了一个地图缩减程序,我的值格式为:

Integer@BitSet

我想减少随机播放的大小。使用

是否合适
Vector<Object> vec=new Vector();
vec.add(Integer);
vec.add(BitSet);

这个向量是否大?在我的情况下哪个数据结构最好?

2 个答案:

答案 0 :(得分:0)

BitSetIntegers都来自Object

所以你的例子会有用。

Vector已同步,因此会导致性能下降。

我会使用ArrayList界面。

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

我没有看到任何共同点,只有对象。

将单个类用作Structure的其他方法,

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);

....

答案 1 :(得分:0)

如果要减少shuffle大小,最小化它的一种好方法是实现自定义Writable类。在hadoop如何处理奇怪类型的序列化时,有时可能会有相当多的开销,因此自定义Writable可以让您完全控制,并且您还可以使用非常有效的“原始”Writable类型。你可以这样做:

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);
    }

}

请注意,上面假设使用Java 7,将BitSet转换为byte[]。如果使用Java 6,则可能需要实现不同的转换方法。