4

以前のスレッドHadoopで非常によく似た質問をしました:キーと値のペアの値としてdoubleの配列を使用するにはどうすればよいですか?

私の問題は、位相を減らすためにマップから値としてdouble配列を渡したいということです。私が得た答えは、シリアル化してテキストに変換し、それをレデューサーに渡して逆シリアル化することでした。これは優れたソリューションですが、2回のシリアル化と逆シリアル化に似ています。

ArrayWritableは、たとえばFloatWritableのようにWritableを実装する型のみを受け入れます。したがって、別の解決策は、doubleの配列をDoubleWritablesの配列に変換することです。しかし、これにも時間がかかり、Writablesは非常に高価なリソースです。ArrayWritable array = new ArrayWritable(Double.class)のような非常に単純なソリューションはありませんか?

4

2 に答える 2

8

独自の書き込み可能なインターフェイスを実装するだけです。

例えば、

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[]の値タイプとして指定できます。Map

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

Serializable要素タイプがSerializable、で、プリミティブがすべての場合、 Java配列は自動的に作成されますSerializable

于 2012-10-14T00:55:06.627 に答える