如何在Hadoop中序列化List集合对象?

时间:2013-06-20 18:16:58

标签: java serialization hadoop

有没有办法在Hadoop中序列化java集合?

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对象?

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

看看ArrayWritable。它允许您序列化一组实例(所有相同的类型)。您可以从列表中构建其中一个

答案 2 :(得分:0)

如果你有很多序列化的东西,你可能会发现Avro很有用。