要执行二级排序,我们必须创建一个复合键,它扩展了 WritableComparable 接口(interface)并实现了 compareTo()。
在“Hadoop:权威指南”一书和其他地方的几乎所有博客中,排序是基于扩展 WritableComparator 的单独类(书中的 KeyComparator)的 compare() 方法进行的。
compare() 和 compareTo() 都具有相同的逻辑。既然WritableComparator的compare()是用来对组合键进行排序的,那么CompositeKey的compareTo()什么时候真正用到呢?
最佳答案
Sortcomarator 用于对 map 输出进行排序。如果您不指定 sortcomparator 类,它将使用自定义可写类的 comapreTo() 方法。如果指定了 sortcomparator,它将使用它而不是自定义可写的 compareTo() 方法。但是没有优势就是使用默认的compare(WritableComparable a, WritableComparable b)
这与 Writablecomparable comapreTo() 方法相同,它将流中的记录反序列化为对象并进行比较。我认为 hadoop 使用 sortcomparator 而不是默认的 writablecomparable comapreTo() 方法,因为前者有一个最佳的 compare() 方法 compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
比较流中的记录而不将其反序列化为对象。
希望这能回答你的问题。
关于sorting - 为什么 mapreduce 二级排序不在复合键的 compareTo() 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32995130/