0

是否允许将对象(如树)作为 Hadoop 中映射器的输出值传递?是这样,怎么样?

4

1 回答 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 回答