只需编写自己的Writable
. 在您的示例中,解决方案可能如下所示:
public class UserPageWritable implements WritableComparable<UserPageWritable> {
private String userId;
private String pageId;
@Override
public void readFields(DataInput in) throws IOException {
userId = in.readUTF();
pageId = in.readUTF();
}
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(userId);
out.writeUTF(pageId);
}
@Override
public int compareTo(UserPageWritable o) {
return ComparisonChain.start().compare(userId, o.userId)
.compare(pageId, o.pageId).result();
}
}
虽然我认为您的 ID 可能是 a long
,但这里有String
版本。基本上只是Writable
接口上的正常序列化,请注意它需要默认构造函数,因此您应该始终提供一个。
逻辑清楚地告诉了如何对compareTo
数据集进行排序,还告诉 reducer 哪些元素是相等的,以便可以对它们进行分组。
ComparisionChain
是Guava的一个很好的工具。
不要忘记覆盖equals和hashcode!partitioner 将通过 key 的 hashcode 来确定 reducer。