【问题标题】:Reverse Sorting Reducer Keys反向排序减速器键
【发布时间】:2020-10-16 05:56:25
【问题描述】:

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

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

【问题讨论】:

  • 使键成为实现 Comparable 接口的类的对象,并根据自己的喜好覆盖 compare 方法。

标签: java hadoop mapreduce


【解决方案1】:

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

您的比较器必须实现RawComparator interface

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

【讨论】:

  • @ Wookai - 如果我不打扰您,您能否建议在新的 hadoop API 中设置与 setOutputKeyComparatorClass 等效的方法?
【解决方案2】:

示例,简单的代码

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; 

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        • 2013-03-20
        • 1970-01-01
        • 2014-02-08
        相关资源
        最近更新 更多