是否允许将对象(如树)作为 Hadoop 中映射器的输出值传递?是这样,怎么样?
问问题
2422 次
1 回答
3
<Text, IntWritable>
扩展 Tariq 的链接,并简单地详细说明树形图的一种可能实现:
public class TreeMapWritable extends TreeMap<Text, IntWritable>
implements Writable {
@Override
public void write(DataOutput out) throws IOException {
// write out the number of entries
out.writeInt(size());
// output each entry pair
for (Map.Entry<Text, IntWritable> entry : entrySet()) {
entry.getKey().write(out);
entry.getValue().write(out);
}
}
@Override
public void readFields(DataInput in) throws IOException {
// clear current contents - hadoop re-uses objects
// between calls to your map / reduce methods
clear();
// read how many items to expect
int count = in.readInt();
// deserialize a key and value pair, insert into map
while (count-- > 0) {
Text key = new Text();
key.readFields(in);
IntWritable value = new IntWritable();
value.readFields(in);
put(key, value);
}
}
}
基本上,Hadoop 中的默认序列化工厂期望对象输出实现 Writable 接口(上面详述的 readFields 和 write 方法)。通过这种方式,您几乎可以扩展任何类以改造序列化方法。
org.apache.hadoop.io.serializer.JavaSerialization
另一种选择是通过配置配置属性来启用 Java 序列化(使用默认的 Java 序列化方法)io.serializations
,但我不建议这样做。
于 2012-12-19T23:30:51.623 回答