Java 哪个密钥类适合进行二次排序?

Java 哪个密钥类适合进行二次排序?,java,sorting,hadoop,mapreduce,Java,Sorting,Hadoop,Mapreduce,在Hadoop中,您可以使用二级排序机制对值进行排序,然后再将其发送到reducer 在Hadoop中实现这一点的方法是,将要排序的值添加到键中,然后使用一些定制的组和键比较方法,这些方法钩住排序系统 因此,您需要有一个键,它基本上由实际键和排序依据的值组成。为了使这个执行足够快,我需要一种创建复合密钥的方法,该方法也可以轻松分解为组和密钥比较方法所需的单独部分 最聪明的方法是这样做。是否有一个“开箱即用”的Hadoop类可以在这方面帮助我,或者我必须为每个map reduce步骤创建一个单独的

在Hadoop中,您可以使用二级排序机制对值进行排序,然后再将其发送到reducer

在Hadoop中实现这一点的方法是,将要排序的值添加到键中,然后使用一些定制的组和键比较方法,这些方法钩住排序系统

因此,您需要有一个键,它基本上由实际键和排序依据的值组成。为了使这个执行足够快,我需要一种创建复合密钥的方法,该方法也可以轻松分解为组和密钥比较方法所需的单独部分

最聪明的方法是这样做。是否有一个“开箱即用”的Hadoop类可以在这方面帮助我,或者我必须为每个map reduce步骤创建一个单独的键类

如果密钥实际上是由多个部分组成的组合(由于分区器的原因,也需要单独使用),我该如何做

你们推荐什么


另外,我想添加标签“secondary sort”,但我还没有足够的代表来这么做。

我无法理解这个问题。我有一个工作副本SecondarySort,它从值列表中打印最大值


您需要更改键重新分区和分组的方式,这基本上意味着您在键中放入了一种以上的数据类型,整个覆盖了用于分区和分组的comparator方法

-如果您想要强类型、健壮的代码进行二次排序,您可以序列化/反序列化密钥,并将输入数据作为对象或bean处理

-对于更简单的场景,只需在值之间加一个“#”符号

这里有一篇关于这方面的高级文章:


我一直都遇到这种情况,对编写自定义复合键类感到厌倦。我编写了一个通用元组类,它是一个对象列表,可以用作复合键。该列表可能包含任意数量的Java原始包装器类型的对象。它实现了可写性。可在此处查看来源


有一种情况,我必须对两列数据进行排序,一列是字符串类型,另一列是整数类型。我编写了自定义的WritableComparable,在compareTo方法中,我编写了逻辑。从我的观点来看,这实际上是一个最好的方法,因为我们可以自定义排序逻辑。

好了(我添加了标记):-)谢谢您添加标记:)我不太明白您的问题,您介意添加一个简短的示例吗?