哪个关键类适合二级排序?

时间:2010-07-19 10:11:51

标签: java sorting hadoop mapreduce

在Hadoop中,您可以使用辅助排序机制在将值发送到reducer之前对值进行排序。

在Hadoop中完成此操作的方法是添加值以按键排序,然后使用一些自定义组和键比较方法挂钩到排序系统。

因此,您需要拥有一个基本上由真实密钥和要排序的值组成的密钥。为了使这个表现足够快,我需要一种创建复合键的方法,该键也很容易分解为组和键比较方法所需的单独部分。

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

如果密钥实际上是由多个部分组成的复合(由于分区也需要单独使用),我该怎么做呢?

你们推荐什么?

P.S。我想添加标签“secondary-sort”但我还没有足够的代表这样做。

4 个答案:

答案 0 :(得分:1)

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

https://github.com/pranab/chombo/blob/master/src/main/java/org/chombo/util/Tuple.java

答案 1 :(得分:0)

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

https://github.com/kapild/hadoop-examples/tree/master/src/SecondarySort

答案 2 :(得分:0)

您需要更改密钥重新分区和分组的方式,这显然意味着您在密钥中放置了多于1种数据类型,整个覆盖比较器方法以进行分区和分组....

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

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

这里有一篇很高级的文章:

http://pkghosh.wordpress.com/2011/04/13/map-reduce-secondary-sort-does-it-all/

答案 3 :(得分:0)

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