2013-06-03 67 views
0

的complexType我有這樣的類別:ReadField與hadoop的

public class Stripe implements WritableComparable<Stripe>{ 
    private List<Term> occorrenze = new ArrayList<Term>(); 

    public Stripe(){} 

    @Override 
    public void readFields(DataInput in) throws IOException { 

    } 
} 


public class Term implements WritableComparable<Term> { 

    private Text key; 
    private IntWritable frequency; 

    @Override 
    public void readFields(DataInput in) throws IOException { 
     this.key.readFields(in); 
     this.frequency.readFields(in); 
    } 

條紋是期限(對文本和intWritable的)的列表。 如何設置從DataInput讀取複雜類型Stripe的方法「readField」?

回答

1

要序列化一個列表,你需要寫出列表的長度,然後是元素本身。對於條紋簡單的閱讀字段/寫方法對可能是:

@Override 
public void readFields(DataInput in) throws IOException { 
    occorrenze.clear(); 
    int cnt = in.readInt(); 
    for (int x = 0; x < cnt; x++) { 
     Term term = new Term(); 
     term.readFields(in); 
     occorrence.add(term); 
    } 
} 

@Override 
public void write(DataOutput out) throws IOException { 
    out.writeInt(occorrenze.size()); 
    for (Term term : occorrenze) { 
     term.write(out); 
    } 
} 

你能做出這樣更有效使用的Vint,而不是一個int,並通過使用條款池可以重新使用,以節省對象創建/垃圾收集中的readFields方法

0

您可以使用ArrayWritable,它是相同類型的可寫列表。