2013-06-21 21 views
0

這是實現可寫的類..序列化Hadoop中 - 可寫

public class Test implements Writable { 
    List<AtomicWritable> atoms = new ArrayList<AtomicWritable>(); 

    public void write(DataOutput out) throws IOException { 
     IntWritable size = new IntWritable(atoms.size()); 
     size.write(out); 
     for (AtomicWritable atom : atoms) 
      atom.write(out); 
    } 

    public void readFields(DataInput in) throws IOException { 
     atoms.clear(); 
     IntWritable size = new IntWritable(); 
     size.readFields(in); 
     int n = size.get(); 
     while(n-- > 0) { 
      AtomicWritable atom = new AtomicWritable(); 
      atom.readFields(in); 
      atoms.add(atom); 
     } 
    } 
} 

我會很感激,如果人能幫助我瞭解如何調用寫和閱讀字段的方法。 基本上我沒有理解如何在這種情況下構造Test對象。將對象寫入DataOutput obj後,如何在DataInput對象中將其恢復。這可能聽起來很愚蠢,但是Hadoop的新手並且已經分配了一個使用Hadoop的項目。請幫忙。

謝謝!

+0

你需要考慮它不是線程安全的。 –

+0

小專家提示:如果你打算在這裏問很多[問題](http://stackoverflow.com/users/2503555/rekha-gupta?tab=questions),特別是在像Hadoop這樣不太擁擠的主題上(比C#和Java更加擁擠),請確保你對[你以前問過的]提出的問題進行了讚揚並接受了答案(http://stackoverflow.com/questions/17220884/how-to-serialiaze-list-collection-對象在-hadoop的)。如果你不這樣做,你很快就會失去對社區的同情。 – jason

回答

0

基本上我沒有理解如何在這種情況下構造Test對象。

是的,你錯過了這一點。如果需要建設的Test的實例,填充atoms,那麼你需要一個構造函數添加到Test

public Test(ArrayList<AtomicWritable> atoms) { 
    this.atoms = atoms; 
} 

,或者您需要使用默認的構造函數,並添加方法或setter方法,可以讓你將項目添加到atoms或設置值atoms。後者實際上在Hadoop框架中很常見,有一個默認構造函數和一個set方法。參見例如,Text.set

別叫readFieldswrite;當Hadoop框架需要對mapreduce的輸入和輸出進行序列化和反序列化時,Hadoop框架會爲您提供幫助。

+0

永遠不會忘記默認的構造函數;-) –

+0

@Thomas Jungblut:那麼他不能設置'atoms'(所以他需要一個構造函數來讓他這麼做,或者是一個setter)。雖然,但我會做一個小小的編輯。謝謝。 – jason

+0

非常感謝Jason和Thomas!這有助於!另外,感謝上面有關發佈問題的提示:)本網站非常新。 –