为什么mapreduce二级排序不在复合键的compareTo()上?



为了执行二级排序,我们必须创建一个复合键,它扩展了WritableComparable接口并实现了compareTo()。

在"Hadoop:权威指南"这本书和几乎所有其他地方的博客中都显示,排序是基于扩展WritableComparator的单独类(书中的KeyComparator)的compare()方法进行的。

compare()和compareTo()具有相同的逻辑。由于WritableComparator的compare()用于组合键的排序,什么时候compareTo()的CompositeKey是实际使用?

Sortcomparator用于对映射输出进行排序。如果您没有指定sortcomparator类,它将使用自定义可写类的compapreto()方法。如果指定了sortcomparator,它将使用该方法而不是自定义的writable的compareTo()方法。但是使用默认的compare(WritableComparable a, WritableComparable b)没有优势,它与Writablecomparable compapreto()方法相同,它将流中的记录反序列化为对象并对其进行比较。我认为hadoop使用sortcomparator而不是默认的可写可比较的compapreto()方法,因为前者有一个最优的比较()方法compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2),其中来自流的记录进行比较而不将其反序列化为对象。

希望这能回答你的问题

谢谢Vignesh。我进一步阅读了这本书(第三版,第268页)。

控制排序顺序

  1. 如果设置了属性mapred.output.key.comparator.class,无论是显式设置还是在Job上调用setSortComparatorClass(),则

  2. 否则,键必须是WritableComparable的子类,并且使用已注册的键类比较器。

  3. 如果没有注册的比较器,则使用RawComparator将被比较的字节流反序列化为对象和委托WritableComparable的compareTo()方法

所以IMO当key没有实现WritableComparable接口或者我们不满意实现的comparTo()方法,那么只有sortcomparator是有意义的

相关内容

  • 没有找到相关文章

最新更新