我已为地图作业实施了 WritableComparable ,并已向其传递了三个值。
public class KeyCustom implementsw WritableComparable<KeyCustom>
{
private Text placeOfBirth;
private Text country;
private LongWritable age;
//Implemented constructors and set methods, write, readFields, hashCode and equals
@Override
public int compareTo(KeyCustom arg0)
{
return placeOfBirth.compareTo(arg0.placeOfBirth);
}
}
但是当我在减速器中记录这三个字段时,我可以清楚地看到所有同一个国家/地区的人正在组合在一起。如果有人可以帮助我,那么我的所有减压器都会让那些出生地相同的人,那就太棒了。我不知道怎么做或者我的compareTo函数是错误的。
感谢所有帮助。
答案 0 :(得分:3)
你正试图用错误的方法解决你的任务。你真正需要的是实现适当的分区。
顺便说一下,您不需要特殊的compareTo()
实施来进行特殊分区。
更新:
尝试将作业中的分区程序更改为TotalOrderPartitioner,您的问题可能会得到解决。 Here is not bad example看起来应该是什么样的。
答案 1 :(得分:1)
我会说你有两个选择
1)自定义分区,如上所述?
OR
2)
Overwride HashCode()
为
@Override public int hashCode() {
return placeOfBirth.hashCode();
}
<强>原因强>
默认分区程序类适用于writableComaparable的HashCode 。 因此,对于自定义的WritableComparable,您需要覆盖HashCode(),这使得 Partioner能够将地图输出分割为reducers 。或者你可以实现并将你自己的partioner类分配给只考虑分配的palceOfBirthField 的作业。