在hadoop中将null写入dataoutput

u91tlkcl  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(318)

我正在使用hadoop0.20.2。我在写一个东西 X 哪个实现了 Writable . X 有几个字段是 Integer . 对于这些领域 null 价值具有特殊的意义。
序列化对象时,通过写入 DataOutput outwrite 方法 Writable 接口,有什么方法可以写吗 null ? 或者我应该使用单独的布尔值来表示值为空?

1aaf6o9v

1aaf6o9v1#

序列化时,在java对象序列化协议中,空对象的大小正好是1字节。所以我不认为你会有任何问题 write 你习惯的方法 Writable .
作为一般规则,这实际上取决于你试图建立什么样的模型。如果你想代表一个 Boolean null表示它不在这里,您应该默认为false。如果它是一个整数,那么应该默认为数据集的默认值。因此,除非有一些特定的处理与您提到的“特殊意义”相关,否则我认为您可以编写null,否则应该使用默认值。

rmbxnbpk

rmbxnbpk2#

nullwritable是一种特殊的可写类型,因为它具有零长度序列化。不向流写入或从流读取字节。更多参考请看hadoop权威指南第104页

ffscu2ro

ffscu2ro3#

布尔是将对象属性标记为 NULL .
考虑这种情况:

public class LongMessage implements Writable {

  private long tag;
  private String data;
  // interface methods omitted first
}

所以呢 data 可能是 null 不管什么原因。因此,我将实现读/写,如下所示:

@Override
  public void readFields(DataInput in) throws IOException {
    tag = in.readLong();
    if (in.readBoolean()) {
      data = in.readUTF();
    } else {
      data = null;
    }
  }

  @Override
  public void write(DataOutput out) throws IOException {
    out.writeLong(tag);
    if (data != null) {
      out.writeBoolean(true);
      out.writeUTF(data);
    } else {
      out.writeBoolean(false);
    }
  }

它甚至相当可读。但是请注意,正如javadocs中所述,每个记录有一个字节的恒定开销 #writeBoolean :
将布尔值写入此输出流。如果参数v为真,则写入值(字节)1;如果v为假,则写入值(字节)0

相关问题