如何在Hadoop中定制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;
    }
}

序列化集合非常简单。

@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);
    }
}

Field也必须实现Writable

本教程解释得更好:http://www.hadoopmaterial.com/2013/10/custom-hadoop-writable-data-type.html

相关内容

  • 没有找到相关文章

最新更新