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

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

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

  1. Integer@BitSet

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

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

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

0dxa2lsx

0dxa2lsx1#

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

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

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

  1. public class Struct{
  2. private Integer mInt;
  3. private BitSet mBitSet;
  4. }
  5. ...
  6. Struct struct;
  7. List<Struct> bb = new ArrayList<Struct>();
  8. struct = new Struct(new Integer(3));
  9. bb.add(struct);
  10. struct = new Struct(new BitSet(5));
  11. bb.add(struct);
  12. ....
展开查看全部
w9apscun

w9apscun2#

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

  1. public class IntAndBitSetWritable implements Writable {
  2. private IntWritable n;
  3. private BytesWritable bytes;
  4. @Override
  5. public void readFields(DataInput in) throws IOException {
  6. n.readFields(in);
  7. bytes.readFields(in);
  8. }
  9. @Override
  10. public void write(DataOutput out) throws IOException {
  11. n.write(out);
  12. bytes.write(out);
  13. }
  14. public BitSet getBitSet() {
  15. return BitSet.valueOf(bytes.getBytes());
  16. }
  17. public int getInt() {
  18. return n.get();
  19. }
  20. public void setBitSet(BitSet b) {
  21. byte[] arr = b.toByteArray();
  22. bytes.setSize(arr.length);
  23. bytes.set(arr, 0, arr.length);
  24. }
  25. public void setInt(int i) {
  26. n.set(i);
  27. }
  28. }

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

展开查看全部

相关问题