为了执行二级排序,我们必须创建一个复合键,它扩展了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页)。
控制排序顺序
如果设置了属性mapred.output.key.comparator.class,无论是显式设置还是在Job上调用setSortComparatorClass(),则
否则,键必须是WritableComparable的子类,并且使用已注册的键类比较器。
如果没有注册的比较器,则使用RawComparator将被比较的字节流反序列化为对象和委托WritableComparable的compareTo()方法
所以IMO当key没有实现WritableComparable接口或者我们不满意实现的comparTo()方法,那么只有sortcomparator是有意义的