[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.내가 생각할 수있는 가장 간단한 방법은 그것들을 단일 문자열로 병합하는 것입니다.
내가 생각할 수있는 가장 간단한 방법은 그것들을 단일 문자열로 병합하는 것입니다.
output.collect(custID, prodID + "," + rate);
그런 다음 감속기를 백업 할 경우 분할하십시오.
어쩌면 우리가 더 좋은 예제를 줄 수 있을지도 모르겠다.
업데이트 : 그건, 당신은 최선의 방법을 요청했다. 가장 정확한 방법은 아마도 prodID와 rate를 그룹화하여 별도의 클래스를 만들고 보내려는 것입니다.
-
==============================
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));
희망이 도움이됩니다.
from https://stackoverflow.com/questions/15734154/how-java-hadoop-mapper-can-send-multiple-values by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브 QL - 각 항목 당 행 수 제한 (0) | 2019.06.20 |
---|---|
[HADOOP] MapReduce의 교차 제품 (0) | 2019.06.20 |
[HADOOP] 창문에 hadoop 2.2 빌드 (0) | 2019.06.20 |
[HADOOP] Hadoop : MapReduce 동안 OutputCollector는 어떻게 작동합니까? (0) | 2019.06.20 |
[HADOOP] hadoop에서 단어 수를 값으로 정렬하는 법? [복제] (0) | 2019.06.20 |