我已经为我的map作业实现了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);
}
}
但是当我在我的减速器中记录这三个字段时,我可以清楚地看到所有具有相同国家的人都被分组在一起。如果有人能帮助我,这样我所有的还原得到相同的出生地点的人,那就太好了。我不知道如何做到这一点,或者如果我的比较功能是错误的。
谢谢你的帮助。
你试图用错误的方法解决你的任务。您真正需要的是实现适当的分区。
- 下面是编写自定义分区程序的详细示例。这是MapReduce分区的基本类API。
顺便说一下,你不需要特殊的compareTo()
实现来做特殊的分区。
尝试在作业中将partitioner更改为TotalOrderPartitioner,可能您的问题将得到解决。这里有一个不错的例子,说明它应该是什么样子的
我想说你有两个选择
1)自定义分区,如上面讨论的?
或2)Overwride HashCode()
@Override public int hashCode() {
return placeOfBirth.hashCode();
}
<<p> 原因/strong> 默认分区器类作用于writableComaparable的HashCode。因此,对于自定义WritableComparable,您需要覆盖HashCode(),这使得 partitioner能够将映射输出隔离到reducer 。或者您可以实现并将您自己的分区程序类分配给作业,该作业将只考虑分区
的palceOfBirthField。