Java 在hadoop中,哪种数据结构最好在映射输出值中包含多个类型?
我编写了一个map reduce程序,其值格式为: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
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,您可能需要实现不同的转换方法