反向排序减速器关键帧



以相反的顺序将Map Output键获取到reducer的最佳方法是什么?默认情况下,reducer按关键帧的升序接收所有关键帧。任何帮助或评论都将广受欢迎。

简单地说,在正常情况下,如果映射发射键1,4,5,2,则reducer接收的键与1,2,3,4,5相同。我希望减速器接收5,4,3,2,1

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

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

对于Hadoop2.X,这是通过使用Job.setSortComparatorClass来完成的,仍然使用RawComparator的实现。

示例,简单代码

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,然后在减速器中将其再次乘以-1,得到5,4,3,2,1。这将导致框架按sudo降序排序。在更复杂的排序中,最好编写一个用于比较的自定义类,然后将其设置在驱动程序类中。

根据@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
  }
}

相关内容

  • 没有找到相关文章

最新更新