4

我在之前的线程Hadoop 中提出了一个非常相似的问题:如何将一个双精度数组作为键值对中的值?.

我的问题是我想将双数组作为值从映射传递到减少阶段。我得到的答案是序列化,转换为文本,将其传递给减速器并反序列化。这是一个很好的解决方案,但它就像对它进行两次序列化和反序列化。

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

4

2 回答 2

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();
        }
    }
}
于 2012-10-14T01:47:20.127 回答
0

您可以指定double[]a 的值类型Map

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

Serializable如果元素类型是, Java 数组是自动的Serializable,而原语是 all Serializable

于 2012-10-14T00:55:06.627 回答