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

原文 标签 sorting hadoop mapreduce

要执行二级排序,我们必须创建一个复合键,它扩展了 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/

相关文章:

sorting - 帮助使用 Java 代码对 GPA 进行排序

hadoop - 运行非阻塞系列作业

hadoop - Hive 和正则表达式

java - 交换键和值映射器hadoop

hadoop - 在 map-reduce 输出中重复 "keys"?

c# - C#快速排序算法无法继续

如果你想使用它的方法,需要使用接口(interface)的Java类

java - 如何根据另一个顺序对多个ArrayList排序?

hadoop - 名称节点在RAM或硬盘中的何处?

hadoop - hadoop集群中的Mapreduce执行