Implementing WritableComparable for Hadoop



我已经为我的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。

相关内容

  • 没有找到相关文章

最新更新