我正在使用hadoop0.20.2。我在写一个东西 X 哪个实现了 Writable . X 有几个字段是 Integer . 对于这些领域 null 价值具有特殊的意义。序列化对象时,通过写入 DataOutput out 在 write 方法 Writable 接口,有什么方法可以写吗 null ? 或者我应该使用单独的布尔值来表示值为空?
X
Writable
Integer
null
DataOutput out
write
1aaf6o9v1#
序列化时,在java对象序列化协议中,空对象的大小正好是1字节。所以我不认为你会有任何问题 write 你习惯的方法 Writable .作为一般规则,这实际上取决于你试图建立什么样的模型。如果你想代表一个 Boolean null表示它不在这里,您应该默认为false。如果它是一个整数,那么应该默认为数据集的默认值。因此,除非有一些特定的处理与您提到的“特殊意义”相关,否则我认为您可以编写null,否则应该使用默认值。
Boolean
rmbxnbpk2#
nullwritable是一种特殊的可写类型,因为它具有零长度序列化。不向流写入或从流读取字节。更多参考请看hadoop权威指南第104页
ffscu2ro3#
布尔是将对象属性标记为 NULL .考虑这种情况:
NULL
public class LongMessage implements Writable { private long tag; private String data; // interface methods omitted first }
所以呢 data 可能是 null 不管什么原因。因此,我将实现读/写,如下所示:
data
@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
#writeBoolean
3条答案
按热度按时间1aaf6o9v1#
序列化时,在java对象序列化协议中,空对象的大小正好是1字节。所以我不认为你会有任何问题
write
你习惯的方法Writable
.作为一般规则,这实际上取决于你试图建立什么样的模型。如果你想代表一个
Boolean
null表示它不在这里,您应该默认为false。如果它是一个整数,那么应该默认为数据集的默认值。因此,除非有一些特定的处理与您提到的“特殊意义”相关,否则我认为您可以编写null,否则应该使用默认值。rmbxnbpk2#
nullwritable是一种特殊的可写类型,因为它具有零长度序列化。不向流写入或从流读取字节。更多参考请看hadoop权威指南第104页
ffscu2ro3#
布尔是将对象属性标记为
NULL
.考虑这种情况:
所以呢
data
可能是null
不管什么原因。因此,我将实现读/写,如下所示:它甚至相当可读。但是请注意,正如javadocs中所述,每个记录有一个字节的恒定开销
#writeBoolean
:将布尔值写入此输出流。如果参数v为真,则写入值(字节)1;如果v为假,则写入值(字节)0