要执行二级排序,我们必须创建一个复合键,它扩展了WritableComparable接口并实现了compareTo()。
在“Hadoop:The Definitive Guide”一书中,几乎所有其他博客都显示基于扩展WritableComparator的单独类(本书中的KeyComparator)的compare()方法进行排序。
compare()和compareTo()具有相同的逻辑。由于WritableComparator的compare()用于对复合键进行排序,所以何时实际使用了CompositeKey的compareTo()?
答案 0 :(得分:1)
Sortcomparator用于对地图输出进行排序。如果您没有指定sortcomparator类,它将使用自定义可写类的comapreTo()方法。如果指定了sortcomparator,它将使用它而不是自定义可写的compareTo()方法。但是使用与Writablecomparable comapreTo()方法相同的默认compare(WritableComparable a, WritableComparable b)
没有任何优势,它将流中的记录反序列化为对象并进行比较。我认为hadoop使用sortcomparator而不是默认的writablecomparable comapreTo()方法,因为前者有一个最佳的compare()方法compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
,其中比较流中的记录而不将其反序列化为对象。
希望这能回答你的问题。
答案 1 :(得分:0)
谢谢Vignesh。我在书中进一步阅读(第3版,第268页)。
控制排序顺序
如果设置了属性mapred.output.key.comparator.class,无论是显式还是通过在Job上调用setSortComparatorClass(),那么 使用该类的实例。
否则,键必须是WritableComparable的子类,并且使用键类的注册比较器。
- 醇>
如果没有注册的比较器,则使用RawComparator将反比较的字节流反序列化为对象和 委托WritableComparable的compareTo()方法。
所以IMO当key没有实现WritableComparable接口或者我们对实现的comparTo()方法不满意时,只有sortcomparator才有意义。