反向排序减速键

时间:2012-07-26 13:59:58

标签: java hadoop mapreduce bigdata

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

简单来说,在正常情况下,如果地图发出键 1,4,3,5,2 ,则reducer会收到与 1,2,3,4相同的内容, 5 。我希望reducer接收 5,4,3,2,1

4 个答案:

答案 0 :(得分:4)

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

您的比较器必须实现RawComparator interface

使用Hadoop 2.X,可以使用Job.setSortComparatorClass来完成,仍然使用RawComparator的实现。

答案 1 :(得分:4)

示例,简单代码

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; 

答案 2 :(得分:1)

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

答案 3 :(得分:0)

根据@ user3123372的回答,您可以扩展Text Class并覆盖compare方法。

public class NewText extends Text implements Writable,WritableComparable<BinaryComparable> { 
 @Override
 public int compareTo(BinaryComparable other) {
   return -1 * super.compareTo(other);  //Return inverse value
  }
}