在Hadoop中,您可以使用辅助排序机制在将值发送到reducer之前对值进行排序。
在Hadoop中完成此操作的方法是添加值以按键排序,然后使用一些自定义组和键比较方法挂钩到排序系统。
因此,您需要拥有一个基本上由真实密钥和要排序的值组成的密钥。为了使这个表现足够快,我需要一种创建复合键的方法,该键也很容易分解为组和键比较方法所需的单独部分。
最聪明的方法是做到这一点。是否有一个“开箱即用”的Hadoop类可以帮助我,或者我是否必须为每个map-reduce步骤创建一个单独的键类?
如果密钥实际上是由多个部分组成的复合(由于分区也需要单独使用),我该怎么做呢?
你们推荐什么?
P.S。我想添加标签“secondary-sort”但我还没有足够的代表这样做。
答案 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方法中编写了我的逻辑。从我的角度来看,它实际上是一种最好的方式,因为我们可以自定义排序逻辑。