有没有办法在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
对象?
答案 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很有用。