反向排序减速键

将Map Output键以相反的顺序输入减速器的最佳方法是什么? 默认情况下,reducer按键的升序接收所有键。 任何帮助或评论广泛赞赏。

简单来说,在正常情况下,如果地图发出密钥1,4,3,5,2,则减速器接收与1,2,3,4,5相同的密钥。 我希望减速机能够获得5,4,3,2,1

在Hadoop 1.X中,您可以使用JobConf.setOutputKeyComparatorClass为输出指定自定义比较器类。

您的比较器必须实现RawComparator接口 。

使用Hadoop 2.X,这是通过使用Job.setSortComparatorClass完成的,仍然使用Job.setSortComparatorClass的实现。

样本,简单代码

 class MyKeyComparator extends WritableComparator { protected DescendingKeyComparator() { super(Text.class, true); } @SuppressWarnings("rawtypes") @Override public int compare(WritableComparable w1, WritableComparable w2) { Text key1 = (Text) w1; Text key2 = (Text) w2; return -1 * key1.compareTo(key2); } } 

然后将其添加到作业中

 job.setSortComparatorClass(MyKeyComparator.class); 

您可以根据使用情况更改以下文字类型。

 Text key1 = (Text) w1; Text key2 = (Text) w2; 

在从映射器中发出密钥之前,可以将密钥乘以-1。 这将导致框架按升序排序,但负值-5,-4,-3,-2,-1然后在reducer中再次乘以-1得到5,4,3,2,1 。 这将导致框架按sudo-descending顺序排序。 在更复杂的排序中,最好编写一个自定义类进行比较,然后在驱动程序类中进行设置。