[HADOOP] Hadoop 매퍼가 여러 개의 키를 출력 할 수 있습니까?
HADOOPHadoop 매퍼가 여러 개의 키를 출력 할 수 있습니까?
단일 매퍼 클래스가 단일 실행에서 여러 개의 키 - 값 쌍 (동일한 유형)을 생성 할 수 있습니까?
다음과 같이 mapper에서 키 - 값 쌍을 출력합니다.
context.write(key, value);
아래에 정리 된 Key 버전이 있습니다.
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.ObjectWritable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
public class MyKey extends ObjectWritable implements WritableComparable<MyKey> {
public enum KeyType {
KeyType1,
KeyType2
}
private KeyType keyTupe;
private Long field1;
private Integer field2 = -1;
private String field3 = "";
public KeyType getKeyType() {
return keyTupe;
}
public void settKeyType(KeyType keyType) {
this.keyTupe = keyType;
}
public Long getField1() {
return field1;
}
public void setField1(Long field1) {
this.field1 = field1;
}
public Integer getField2() {
return field2;
}
public void setField2(Integer field2) {
this.field2 = field2;
}
public String getField3() {
return field3;
}
public void setField3(String field3) {
this.field3 = field3;
}
@Override
public void readFields(DataInput datainput) throws IOException {
keyTupe = KeyType.valueOf(datainput.readUTF());
field1 = datainput.readLong();
field2 = datainput.readInt();
field3 = datainput.readUTF();
}
@Override
public void write(DataOutput dataoutput) throws IOException {
dataoutput.writeUTF(keyTupe.toString());
dataoutput.writeLong(field1);
dataoutput.writeInt(field2);
dataoutput.writeUTF(field3);
}
@Override
public int compareTo(MyKey other) {
if (getKeyType().compareTo(other.getKeyType()) != 0) {
return getKeyType().compareTo(other.getKeyType());
} else if (getField1().compareTo(other.getField1()) != 0) {
return getField1().compareTo(other.getField1());
} else if (getField2().compareTo(other.getField2()) != 0) {
return getField2().compareTo(other.getField2());
} else if (getField3().compareTo(other.getField3()) != 0) {
return getField3().compareTo(other.getField3());
} else {
return 0;
}
}
public static class MyKeyComparator extends WritableComparator {
public MyKeyComparator() {
super(MyKey.class);
}
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
return compareBytes(b1, s1, l1, b2, s2, l2);
}
}
static { // register this comparator
WritableComparator.define(MyKey.class, new MyKeyComparator());
}
}
그리고 이것이 Mapper에서 두 키를 모두 출력하려고했습니다 :
MyKey key1 = new MyKey();
key1.settKeyType(KeyType.KeyType1);
key1.setField1(1L);
key1.setField2(23);
MyKey key2 = new MyKey();
key2.settKeyType(KeyType.KeyType2);
key2.setField1(1L);
key2.setField3("abc");
context.write(key1, value1);
context.write(key2, value2);
우리 작업의 출력 형식 클래스는 다음과 같습니다 : org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat
다른 출력 형식 클래스에서는 출력을 추가하지 않고 write 메서드를 구현 한 것을 보았 기 때문에이 사실을 알았습니다.
또한 Mapper 및 Context에 대해 다음 클래스를 사용하고 있습니다. org.apache.hadoop.mapreduce.Mapper org.apache.hadoop.mapreduce.Context
해결법
-
==============================
1.하나의 맵 작업에서 컨텍스트에 여러 번 쓰는 것은 완벽합니다.
하나의 맵 작업에서 컨텍스트에 여러 번 쓰는 것은 완벽합니다.
그러나 키 클래스에 몇 가지 문제가있을 수 있습니다. WritableComparable을 키에 구현할 때마다 equals (Object) 및 hashCode () 메서드도 구현해야합니다. 이것들은 WritableComparable 인터페이스의 일부는 아니기 때문에, Object로 정의되고 있습니다 만, 구현을 제공 할 필요가 있습니다.
기본 파티셔너는 hashCode () 메서드를 사용하여 각 키 / 값 쌍이 어느 감속기로가는 지 결정합니다. 정상적인 구현을 제공하지 않으면 이상한 결과가 발생할 수 있습니다.
일반적으로 hashCode () 또는 비교 메서드를 구현할 때마다 equals (Object) 메서드도 제공해야합니다. Object를 매개 변수로 받아들이는지 확인해야합니다. 이는 Object 클래스에서 정의되는 방식이므로 (구현이 대체 할 가능성이 높음)
from https://stackoverflow.com/questions/6127883/can-hadoop-mapper-produce-multiple-keys-in-output by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 돼지 라틴어를 사용하여 열을 "업데이트하는 방법" (0) | 2019.07.27 |
---|---|
[HADOOP] Hadoop : core-site.xml에서 기본 FileSystem을 HDFS로 설정할 수 없습니다. (0) | 2019.07.27 |
[HADOOP] Hadoop 및 Bash : 파일 이름 일치 범위 삭제 (0) | 2019.07.27 |
[HADOOP] hadoop은 어떻게 입력 파일을 읽습니까? (0) | 2019.07.27 |
[HADOOP] Java Hadoop : 입력 파일로 가져와 각 파일의 줄 수를 출력하는 매퍼를 어떻게 만들 수 있습니까? (0) | 2019.07.27 |