独自の を作成するだけ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 は である可能性があると思いますがlong
、ここにString
バージョンがあります。基本的には、Writable
インターフェイスを介した通常のシリアル化だけです。デフォルトのコンストラクターが必要なため、常に提供する必要があることに注意してください。
ロジックは明らかにデータセットのcompareTo
並べ替え方法を示し、どの要素が等しいかをレデューサーに伝えてグループ化できるようにします。
ComparisionChain
Guavaの素晴らしいユーティリティです。
equals と hashcode をオーバーライドすることを忘れないでください。パーティショナーは、キーのハッシュコードによってレデューサーを決定します。