为了执行二次排序,我们必须创建一个复合键,它扩展了writeablecomparable接口并实现compareto()。
在《hadoop:the definitive guide》(hadoop:the definitive guide)一书和其他地方几乎所有的博客中都显示,排序是基于扩展writablecomparator的独立类(书中的keycomparator)的compare()方法进行的。
compare()和compareto()具有相同的逻辑。由于writeablecomparator的compare()用于对复合键进行排序,那么compositekey的compareto()实际使用的时间是什么时候?
2条答案
按热度按时间disbfnqx1#
sortcomparator用于对Map输出进行排序。如果不指定sortcomparator类,它将使用自定义可写类的comapreto()方法。如果指定了sortcomparator,则它将使用它而不是自定义可写的compareto()方法。但使用默认值没有任何好处
compare(WritableComparable a, WritableComparable b)
这与writeablecomparable comapreto()方法相同,该方法将流中的记录反序列化为对象并进行比较。我认为hadoop使用sortcomparator而不是默认的writeablecompareto()方法,因为前者有一个最佳的compare()方法compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
比较流中的记录而不将其反序列化为对象。希望这能回答你的问题。
szqfcxe22#
谢谢vignesh。我在这本书(第三版,第268页)中读了进一步的内容。
控制排序顺序
如果属性mapred.output.key.comparator.class是显式设置的,或者通过调用作业上的setsortcomparatorclass()设置的,则使用该类的示例。
否则,keys必须是writeablecomparable的子类,并使用key类的注册比较器。
如果没有注册的比较器,则使用rawcomarator将要比较的字节流反序列化为对象,并委托给writeablecomparable的compareto()方法。
因此,当key没有实现writeablecomparable接口或者我们对实现的comparto()方法不满意时,只有sortcomparator才有意义。