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

标签 sorting hadoop mapreduce

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

在“Hadoop:权威指南”一书和几乎所有其他地方的博客中,排序都是基于扩展 WritableComparator 的单独类(书中的 KeyComparator)的 compare() 方法进行的。

compare() 和 compareTo() 具有相同的逻辑。既然WritableComparator的compare()是用来对composite key进行排序的,那么CompositeKey的compareTo()到底什么时候用到呢?

最佳答案

Sortcomparator 用于对 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/

相关文章:

c++ - 对成对的 vector 进行排序

javascript - 排序数组会删除条目吗?

c++ - 如何在 C++ Map 中找到最大值

python - Hadoop作业的描述

amazon-web-services - 错误:java.lang.RuntimeException:PipeMapRed.waitOutputThreads():子进程在AWS-EMR上失败,代码为1,但在本地计算机上工作

JavaScript 在 Chrome 中按多个字段对对象数组进行排序

file - 我可以在 hdfs (hadoop) 中复制数据吗

hadoop - 无法运行 hadoop wordcount 示例?

apache-spark - 如何在 spark sql 中使用 hive 钩子(Hook)

hadoop - 在Windows中的Eclipse中调试hadoop Wordcount程序