Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hadoop中,哪种数据结构最好在映射输出值中包含多个类型?_Java_Data Structures_Hadoop_Vector_Shuffle - Fatal编程技术网

Java 在hadoop中,哪种数据结构最好在映射输出值中包含多个类型?

Java 在hadoop中,哪种数据结构最好在映射输出值中包含多个类型?,java,data-structures,hadoop,vector,shuffle,Java,Data Structures,Hadoop,Vector,Shuffle,我编写了一个map reduce程序,其值格式为: Integer@BitSet 我想减小洗牌的大小。用起来好吗 Vector<Object> vec=new Vector(); vec.add(Integer); vec.add(BitSet); Vector vec=new Vector(); 向量加(整数); 矢量相加(位集); 这个向量大吗?在我的例子中,哪种数据结构最好?位集和整数都是从对象扩展而来的 所以你的例子会起作用 向量是同步的,因此会导致性能下降 我会使用A

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

Integer@BitSet
我想减小洗牌的大小。用起来好吗

Vector<Object> vec=new Vector();
vec.add(Integer);
vec.add(BitSet);
Vector vec=new Vector();
向量加(整数);
矢量相加(位集);

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

位集和整数都是从
对象扩展而来的

所以你的例子会起作用

向量
是同步的,因此会导致性能下降

我会使用
ArrayList
接口

List<Object> bb = new ArrayList<Object>();
bb.add(new Integer(3));
bb.add(new BitSet(5));
List bb=new ArrayList();
bb.添加(新整数(3));
bb.add(新的位集(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);

....
公共类结构{
私有整数造币厂;
私有比特集mBitSet;
}
...
Struct-Struct;
List bb=新的ArrayList();
struct=新结构(新整数(3));
bb.添加(结构);
struct=新结构(新位集(5));
bb.添加(结构);
....

如果您想减小随机播放的大小,最好的方法是实现一个自定义的可写类。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);
    }

}
请注意,以上假设使用Java 7将
位集
转换为
字节[]
。如果使用Java6,您可能需要实现不同的转换方法