2013-06-20 15 views
2

有沒有辦法在Hadoop中序列化java集合?如何序列化Hadoop中的List集合對象?

Writable接口僅用於Java基元。我有以下類的屬性。

private String keywords; 
private List<Status> tweets; 
private long queryTime = 0; 

public TweetStatus(String keys, List<Status> tweets, long queryTime){ 
    this.keywords = keys; 
    this.tweets = tweets; 
    this.queryTime = queryTime; 
} 

我該如何序列化List對象?

+0

你爲什麼不能打破'Status'成一組原語,你可以變成一個'Writable'的? – climbage

+0

「Status」的定義是什麼? – jason

回答

3

Writable接口僅用於Java基元。

沒錯。基本上你需要將你的對象分解成一系列可以序列化的對象。

所以,從第一個原則來說,要序列化一個列表,需要序列化列表的大小,然後序列化列表中的每個元素。這樣,當你需要反序列化時,你知道需要反序列化多少個元素。

像這樣的東西應該讓你在寫(雙關語!)軌道:

class TweetStatusWritable implements Writable { 
    private String keywords; 
    private List<Status> tweets; 
    private long queryTime; 

    // add getters for the above three fields 

    public void readFields(DataInput in) { 
     this.keywords = in.readUTF(); 
     int size = in.readInt(); 
     this.tweets = new List<Status>(); 
     for(int i = 0; i < size; i++) { 
      Status status = // deserialize an instance of Status 
      tweets.add(status); 
     } 
     this.queryTime = in.readLong(); 
    } 

    public void write(DataOutput out) { 
     out.writeUTF(this.keywords); 
     out.writeInt(this.tweets.size()); 
     for(int i = 0; i < this.tweets.size(); i++) { 
      // serialize tweets[i] onto out 
     }  
     out.writeLong(queryTime); 
    } 

    public TweetStatusWritable(
     String keywords, 
     List<Status> tweets, 
     long queryTime 
    ) { 
     this.keywords = keywords; 
     this.tweets = tweets; 
     this.queryTime = queryTime; 
    } 
} 
0

看看ArrayWritable。它允許您序列化一組實例(全部是相同的類型)。你可以從你的列表中創建一個

+0

MapWritable甚至比ArrayWritable更好https://hadoop.apache.org/docs/r2.6.2/api/org/apache/hadoop/io/MapWritable.html –

0

如果你有很多序列化的東西,你可能會發現Avro有用。