在Hadoop中将null写入DataOutput

jay*_*ynp 4 hadoop mapreduce

我正在使用Hadoop 0.20.2.我正在写一个X实现的对象Writable.

X有几个字段是实例Integer.对于这些字段,该null值具有特殊意义.

序列化对象时,通过写入接口DataOutput outwrite方法Writable,有没有办法可以编写null?或者我应该使用单独的布尔值,表明该值为空?

Tho*_*lut 6

布尔值是将对象属性标记为的标准过程NULL.

考虑这种情况:

public class LongMessage implements Writable {

  private long tag;
  private String data;
  // interface methods omitted first
}
Run Code Online (Sandbox Code Playgroud)

所以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);
    }
  }
Run Code Online (Sandbox Code Playgroud)

它甚至非常易读.但请注意,每个记录有一个字节的持续开销,如JavaDocs中所述#writeBoolean:

将布尔值写入此输出流.如果参数v为真,则写入值(字节)1; 如果v为假,则写入值(字节)0