2

我正在处理一个二级排序问题,考虑下面的数据,顺便说一下值可以是 NullWritable。

 Composite key 
    2000 250     
    2000 150
    2000 90

    2001 100
    2001 80

    2002 500
    2002 120

我的复合键由年份(升序)和学生人数(降序)组成。因此,根据我读到的内容,如果我按年份对键进行分组,那么在我的减速器中,我应该在输出中获得每年的最大值,因为我的复合材料的第二部分是按降序排序的。我不明白这背后的逻辑,因为我看不到密钥的哪一部分将被发送到减速器或分组是如何完成的。

4

3 回答 3

0

整个密钥将被发送到减速器。确定哪些键是“相同的GroupingComparator”,以便了解哪些值一起进入对 的调用reduce。如果您的分组仅按年份分组,那么是的,几个键及其所有值将进入一个reduce。我相信您看到的实际密钥将只是该组中的第一个,是的。

我不知道这对你是否有意义。我什至不知道它是否定义了你得到的密钥,因为你说它们在一个组中对你来说都是“相同的”。

通常我使用这种机制来提供一种更快的低级比较器实现,而不是用不寻常的语义来实现。

如果您只想Reducer按排序顺序查看键,那么它已经可以了。例如,它可以记住它看到的最后一个值。例如,如果您需要以 2000 开头的所有键都转到相同Reducer的位置,那是分区器的工作,而不是分组比较器。

于 2013-09-30T10:04:03.883 回答
0

分组键确定将一次性调用reduce方法的键部分。

于 2013-09-30T09:34:55.620 回答
0

当您使用组比较器时,它将决定将转到reduce方法参数Iterable 键值的值。

void reduce(key, Iterable<> values, Context){}

在您的情况下,如果您在 2001 年进行分组,则值 100 和 80 将会消失。

如果您编写自定义分区程序,它将根据您在自定义分区程序中提供的键来决定进入减速器的值。

于 2018-09-27T12:21:32.713 回答