我使用的是Hadoop 0.20.2。我正在编写一个实现Writable的对象X。
X有几个字段,它们是Integer的实例。对于这些字段,null值具有特殊的意义。
在序列化对象时,通过在Writable接口的write方法中写入DataOutput out,有没有一种方法可以编写null?或者我应该使用单独的布尔值来表示值为空?
发布于 2013-03-15 02:33:37
布尔值是将对象属性标记为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);
}
}它甚至可读性很好。但请注意,正如#writeBoolean的JavaDocs中所述,每条记录有一个字节的恒定开销
将一个布尔值写入此输出流。如果参数v为true,则写入值(字节)1;如果v为false,则将值(字节)0写入
发布于 2013-03-15 02:07:02
NullWritable是一种特殊类型的Writable,因为它的序列化长度为零。不向流写入任何字节,也不从流中读取任何字节。有关更多参考信息,请参阅hadoop权威指南pg:104
发布于 2013-03-15 02:26:14
序列化时,空对象的大小在Java object serialization protocol中恰好是1个字节。因此,我认为您的自定义Writable的write方法不会有任何问题。
一般来说,这真的取决于你试图建模的是什么。如果您试图表示一个Boolean,而null表示它不在这里,那么您可能应该缺省为false。如果它是一个整数,你应该默认为你的数据集的默认值。因此,除非有一些与您提到的“特殊意义”相关的特定处理,否则我认为您可以编写一个空,否则您应该使用默认值。
https://stackoverflow.com/questions/15415900
复制相似问题