복붙노트

[HADOOP] Hadoop에서 Writable 클래스를 사용자 정의하는 방법은 무엇입니까?

HADOOP

Hadoop에서 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. ==============================

    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. ==============================

    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

  3. from https://stackoverflow.com/questions/7994438/how-to-customize-writable-class-in-hadoop by cc-by-sa and MIT license