Hadoop:基元数组作为键值对中的值

时间:2012-10-14 00:49:04

标签: java arrays hadoop key-value writable

我在前一个帖子Hadoop: How can i have an array of doubles as a value in a key-value pair?中提出了一个非常类似的问题。

我的问题是我想将一个双数组作为值从map传递到reduce阶段。我得到的答案是序列化,转换为Text,将其传递给reducer并反序列化。这是一个很好的解决方案,但它像序列化和反序列化两次。

ArrayWritable只接受像FloatWritable这样实现Writable的类型。所以另一个解决方案是将我的双精度数组转换为DoubleWritables数组。但这需要一些时间,而Writable是一种非常昂贵的资源。是不是有一个非常简单的解决方案,如ArrayWritable array = new ArrayWritable(Double.class)???

2 个答案:

答案 0 :(得分:8)

只需实现您自己的Writable界面。

例如,

public class DoubleArrayWritable implements Writable {
    private double[] data;

    public DoubleArrayWritable() {

    }

    public DoubleArrayWritable(double[] data) {
        this.data = data;
    }

    public double[] getData() {
        return data;
    }

    public void setData(double[] data) {
        this.data = data;
    }

    public void write(DataOutput out) throws IOException {
        int length = 0;
        if(data != null) {
            length = data.length;
        }

        out.writeInt(length);

        for(int i = 0; i < length; i++) {
            out.writeDouble(data[i]);
        }
    }

    public void readFields(DataInput in) throws IOException {
        int length = in.readInt();

        data = new double[length];

        for(int i = 0; i < length; i++) {
            data[i] = in.readDouble();
        }
    }
}

答案 1 :(得分:0)

您可以指定double[]作为Map的值类型:

Map<String, double[]> map = new HashMap<String, double[]>(); // compiles

如果元素类型为Serializable,则Java数组会自动Serializable,而基元都是Serializable