4

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

简而言之,在正常情况下,如果 map 发出键1,4,3,5,2 ,reducer 会收到与1,2,3,4,5相同的键。我希望减速器改为接收5,4,3,2,1

4

4 回答 4

5

在 Hadoop 1.X 中,您可以使用JobConf.setOutputKeyComparatorClass.

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

在 Hadoop 2.X 中,这是通过Job.setSortComparatorClass使用RawComparator.

于 2012-07-26T14:04:35.270 回答
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; 
于 2015-12-05T15:19:29.123 回答
1

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

于 2016-02-27T01:55:00.100 回答
0

根据@user3123372 的回答,您可以扩展文本类并覆盖比较方法。

public class NewText extends Text implements Writable,WritableComparable<BinaryComparable> { 
 @Override
 public int compareTo(BinaryComparable other) {
   return -1 * super.compareTo(other);  //Return inverse value
  }
}
于 2020-10-15T19:46:24.337 回答