복붙노트

[HADOOP] 자바 하둡 매퍼가 여러 값을 보내는 방법

HADOOP

자바 하둡 매퍼가 여러 값을 보내는 방법

내 매퍼는 다음과 같은 튜플을 보내야합니다.

<custID,prodID,rate>

그리고 감속기에 custID를 키로 보내고 값으로 감산 단계에서 필요한 prodID와 rate를 함께 보내려고합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

public void map(Object key, Text value, Context context) 
        throws IOException, InterruptedException {

    String[] col = value.toString().split(",");
    custID.set(col[0]);
    data.set(col[1] + "," + col[2]);
    context.write(custID, data);
}

public void reduce(Text key, Iterable<Text> values, Context context)
        throws IOException, InterruptedException {

    for (Text val : values) {
        String[] temp = val.toString().split(",");
        Text rate = new Text(temp[1]);
        result.set(rate);
        context.write(key, result);
    }
}

해결법

  1. ==============================

    1.내가 생각할 수있는 가장 간단한 방법은 그것들을 단일 문자열로 병합하는 것입니다.

    내가 생각할 수있는 가장 간단한 방법은 그것들을 단일 문자열로 병합하는 것입니다.

    output.collect(custID, prodID + "," + rate);
    

    그런 다음 감속기를 백업 할 경우 분할하십시오.

    어쩌면 우리가 더 좋은 예제를 줄 수 있을지도 모르겠다.

    업데이트 : 그건, 당신은 최선의 방법을 요청했다. 가장 정확한 방법은 아마도 prodID와 rate를 그룹화하여 별도의 클래스를 만들고 보내려는 것입니다.

  2. ==============================

    2.가장 좋은 방법은 CustomWritables를 작성하는 것입니다.

    가장 좋은 방법은 CustomWritables를 작성하는 것입니다.

    이것은 이중 값입니다. 텍스트 또는 문자열로 변경할 수 있습니다.

    import java.io.DataInput;
    import java.io.DataOutput;
    import java.io.IOException;
    import org.apache.hadoop.io.Writable;
    
    
    /**
     * @author Unmesha SreeVeni U.B
     *
     */
    public class TwovalueWritable implements Writable {
        private double first;
        private double second;
    
        public  TwovalueWritable() {
            set(first, second);
        }
        public  TwovalueWritable(double first, double second) {
            set(first, second);
        }
        public void set(double first, double second) {
            this.first = first;
            this.second = second;
        }
        public double getFirst() {
            return first;
        }
        public double getSecond() {
            return second;
        }
        @Override
        public void write(DataOutput out) throws IOException {
            out.writeDouble(first);
            out.writeDouble(second);
        }
        @Override
        public void readFields(DataInput in) throws IOException {
            first = in.readDouble();
            second = in.readDouble();
        }
    
        /* (non-Javadoc)
         * @see java.lang.Object#hashCode()
         */
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            long temp;
            temp = Double.doubleToLongBits(first);
            result = prime * result + (int) (temp ^ (temp >>> 32));
            temp = Double.doubleToLongBits(second);
            result = prime * result + (int) (temp ^ (temp >>> 32));
            return result;
        }
        /* (non-Javadoc)
         * @see java.lang.Object#equals(java.lang.Object)
         */
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (!(obj instanceof TwovalueWritable)) {
                return false;
            }
            TwovalueWritable other = (TwovalueWritable) obj;
            if (Double.doubleToLongBits(first) != Double
                    .doubleToLongBits(other.first)) {
                return false;
            }
            if (Double.doubleToLongBits(second) != Double
                    .doubleToLongBits(other.second)) {
                return false;
            }
            return true;
        }
        @Override
        public String toString() {
            return first + "," + second;
        }
    }
    

    그리고 매퍼 (mapper)에서

    context.write(key,new TwovalueWritable(prodID,rate));
    

    희망이 도움이됩니다.

  3. from https://stackoverflow.com/questions/15734154/how-java-hadoop-mapper-can-send-multiple-values by cc-by-sa and MIT license