为Hadoop实现WritableComparable

时间:2014-07-10 06:34:28

标签: java hadoop mapreduce compareto

我已为地图作业实施了 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函数是错误的。

感谢所有帮助。

2 个答案:

答案 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 的作业。