2012-10-14 4 views
4

이전 스레드에서 매우 유사한 질문을했습니다. Hadoop: How can i have an array of doubles as a value in a key-value pair?.Hadoop : 키 값 쌍의 값으로 프리미티브 배열

제 문제는 맵에서 값을 double 배열로 전달하여 위상을 줄이려고합니다. 내가 얻은 대답은 직렬화하고, 텍스트로 변환하고, 감속기로 전달하고 비 직렬화하는 것이 었습니다. 이것은 훌륭한 솔루션이지만, 두 번 직렬화 및 비 직렬화와 같은 것입니다.

ArrayWritable은 예를 들어 FloatWritable과 같은 Writable을 구현하는 유형 만 허용합니다. 그래서 또 다른 해결책은 DoubleWritables의 배열로 double 배열을 변환하는 것입니다. 그러나 이것은 약간의 시간도 필요하며 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[]을 지정할 수있는 요소 유형이 Serializable이며, 프리미티브 모든 Serializable을 경우

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

자바 배열은 자동으로 Serializable 있습니다.

+1

이 아닌지도 구조에서 하둡 키 값 쌍이다. 이전 실의 녀석은 내가지도 구조를 언급하고 있다고 생각했습니다. 누구든지 hadoop 단어를 보지 않겠습니까? – jojoba

관련 문제