2

有没有办法在 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对象?

4

3 回答 3

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;
    }
}
于 2013-06-20T18:53:45.977 回答
0

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

于 2013-06-20T18:32:28.930 回答
0

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

于 2013-06-20T18:53:30.733 回答