[HADOOP] Hadoop에서 Writable 클래스를 사용자 정의하는 방법은 무엇입니까?
HADOOPHadoop에서 Writable 클래스를 사용자 정의하는 방법은 무엇입니까?
나는 Writable 클래스를 구현하려고하는데, 쓰기 가능한 클래스를 구현하는 방법에 대해서는 잘 모르지만, 클래스에 중첩 된 객체 (예 : 목록 등)가 있다면 어떤 몸이라도 도움이 될까요? 감사
public class StorageClass implements Writable{
public String xStr;
public String yStr;
public List<Field> sStor
//omitted ctors
@override
public void write(DataOutput out) throws IOException{
out.writeChars(xStr);
out.WriteChars(yStr);
//WHAT SHOULD I DO FOR List<Field>
}
@override
public void readFields(DataInput in) throws IOException{
xStr = in.readLine();
yStr = in.readLine();
//WHAT SHOULD I DO FOR List<Field>
}
}
public class SubStorage{
public String x;
public String y;
}
}
다음은 Field 클래스입니다.
public final class Field implements Comparable<Field>, Serializable {
private String name;
private DataType dataType;
private Object value;
private FieldType fieldType;
public Field(){
}
public Field(String name, DataType dataType, FieldType fieldType){
this(name, dataType, null, fieldType);
}
public Field(String name, DataType type, Object value, FieldType fieldType){
this.name = name;
this.dataType = type;
this.value = value;
this.fieldType = fieldType;
}
}
public enum FieldType {
PRI, LOOKUP, SCD, VERSION, OTHER
}
public enum DataType {
UNDEFINED(4) {
public int getSizeInBytes(Object value) {
return STRING.getSizeInBytes(value);
}
},
STRING(4) {
public int getSizeInBytes(Object value) {
if (value == null) {
return 0;
}
return super.getSizeInBytes(value) + (value.toString().length() * 2); // length + chars
}
},
INT(4),
LONG(8),
DOUBLE(8),
DATETIME(8),
BOOLEAN(1),
BYTE(1),
FLOAT(4),
SHORT(2),
CHAR(2),
DATE(8),
TIME(8),
BLOB(0) {
public int getSizeInBytes(Object value) {
if (value == null) {
return 0;
}
return ((byte[])value).length;
}
};
private final int sizeInBytes;
private DataType(int sizeInBytes) {
this.sizeInBytes = sizeInBytes;
}
public int getSizeInBytes(Object value) {
return sizeInBytes;
}
}
해결법
-
==============================
1.콜렉션을 순차 화하는 것은 매우 간단합니다.
콜렉션을 순차 화하는 것은 매우 간단합니다.
@Override public void readFields(DataInput in) throws IOException { int size = in.readInt(); list= new ArrayList<Field>(size); for(int i = 0; i < size; i++){ Field f = new Field(); f.readFields(in); list.add(f); } } @Override public void write(DataOutput out) throws IOException { out.writeInt(list.size()); for (Field l : list) { l.write(out); } }
필드는 Writable도 구현해야합니다.
-
==============================
2.이 자습서는 더 잘 설명합니다 : http://www.hadoopmaterial.com/2013/10/custom-hadoop-writable-data-type.html
이 자습서는 더 잘 설명합니다 : http://www.hadoopmaterial.com/2013/10/custom-hadoop-writable-data-type.html
from https://stackoverflow.com/questions/7994438/how-to-customize-writable-class-in-hadoop by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop - datanode 및 tasktracker 다시 시작 (0) | 2019.07.11 |
---|---|
[HADOOP] Rstudio- 서버 환경 변수가로드되지 않습니까? (0) | 2019.07.11 |
[HADOOP] Java API를 사용하여 Hadoop에서 파일을 이동 하시겠습니까? (0) | 2019.07.11 |
[HADOOP] 파케 파일에 대한 메타 데이터 생성 (0) | 2019.07.11 |
[HADOOP] HDFS의 블록이 너무 큰 이유는 무엇입니까? (0) | 2019.07.11 |