首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Hadoop中将null写入DataOutput

在Hadoop中将null写入DataOutput
EN

Stack Overflow用户
提问于 2013-03-15 01:16:17
回答 3查看 2.7K关注 0票数 4

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

X有几个字段,它们是Integer的实例。对于这些字段,null值具有特殊的意义。

在序列化对象时,通过在Writable接口的write方法中写入DataOutput out,有没有一种方法可以编写null?或者我应该使用单独的布尔值来表示值为空?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-15 02:33:37

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

考虑一下这种情况:

代码语言:javascript
复制
public class LongMessage implements Writable {

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

因此,无论出于什么原因,data都可能是null。因此,我将实现读/写,如下所示:

代码语言:javascript
复制
  @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);
    }
  }

它甚至可读性很好。但请注意,正如#writeBoolean的JavaDocs中所述,每条记录有一个字节的恒定开销

将一个布尔值写入此输出流。如果参数v为true,则写入值(字节)1;如果v为false,则将值(字节)0写入

票数 6
EN

Stack Overflow用户

发布于 2013-03-15 02:07:02

NullWritable是一种特殊类型的Writable,因为它的序列化长度为零。不向流写入任何字节,也不从流中读取任何字节。有关更多参考信息,请参阅hadoop权威指南pg:104

票数 1
EN

Stack Overflow用户

发布于 2013-03-15 02:26:14

序列化时,对象的大小在Java object serialization protocol中恰好是1个字节。因此,我认为您的自定义Writablewrite方法不会有任何问题。

一般来说,这真的取决于你试图建模的是什么。如果您试图表示一个Boolean,而null表示它不在这里,那么您可能应该缺省为false。如果它是一个整数,你应该默认为你的数据集的默认值。因此,除非有一些与您提到的“特殊意义”相关的特定处理,否则我认为您可以编写一个,否则您应该使用默认值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15415900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档