hadoop:作为键值对中的值的原语数组

m3eecexj  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(402)

我在上一个hadoop线程中提出了一个非常相似的问题:如何在键值对中使用一个double数组作为值。
我的问题是,我想传递一个双数组作为值从Map上减少阶段。我得到的答案是序列化、转换为文本、将其传递给reducer并反序列化。这是一个很好的解决方案,但它就像序列化和反序列化它两次。
arraywritable只接受实现可写的类型,例如floatwritable。所以另一个解决方案是将我的double数组转换成doublewritables数组。但这也需要一些时间,而且可写资源非常昂贵。有没有一个非常简单的解决方案,比如arraywritable array=newarraywritable(double.class)???

a1o7rhls

a1o7rhls1#

只需实现自己的可写接口。
例如,

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();
        }
    }
}
yizd12fk

yizd12fk2#

您可以指定 double[] 作为 Map :

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

java数组自动 Serializable 如果元素类型为 Serializable ,基本体都是 Serializable .

相关问题