2012-10-14 83 views
4

我在前一個線程Hadoop: How can i have an array of doubles as a value in a key-value pair?中詢問了一個非常相似的問題。Hadoop:基元數組作爲鍵值對中的值

我的問題是,我想通過一個雙數組作爲地圖的值來減少相位。我得到的答案是序列化,轉換爲文本,傳遞給reducer並反序列化。這是一個很好的解決方案,但它像序列化和反序列化兩次。

ArrayWritable只接受實現Writable的類型,例如FloatWritable。所以另一個解決方案是將我的雙精度數組轉換爲DoubleWritable的數組。但是這也需要一些時間,Writable是一個非常昂貴的資源。沒有像ArrayWritable array = new ArrayWritable(Double.class)這樣的非常簡單的解決方案?

回答

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

是的,我相信這會適合我的情況。我受到ArrayWritable的影響,從未想到這一點。 – jojoba

+0

是的,它完全符合我的情況。非常感謝你 – jojoba

+0

不客氣) – szhem

0

您可以爲Map指定double[]作爲值類型:

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

Java數組是自動Serializable如果元素類型是Serializable,和原語都是Serializable

+1

這是一個Hadoop鍵值對,而不是從圖結構。上一個線程中的人也認爲我指的是地圖結構。誰也看不到hadoop這個詞? – jojoba