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

时间:2015-10-07 14:36:01

标签: sorting hadoop mapreduce

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

在“Hadoop:The Definitive Guide”一书中,几乎所有其他博客都显示基于扩展WritableComparator的单独类(本书中的KeyComparator)的compare()方法进行排序。

compare()和compareTo()具有相同的逻辑。由于WritableComparator的compare()用于对复合键进行排序,所以何时实际使用了CompositeKey的compareTo()?

2 个答案:

答案 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页)。

  

控制排序顺序

     
      
  1. 如果设置了属性mapred.output.key.comparator.class,无论是显式还是通过在Job上调用setSortComparatorClass(),那么   使用该类的实例。

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

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

  6.   

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