理解groupcomparator

hfwmuf9z  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(333)

我正在处理第二个排序问题,考虑下面的数据,顺便说一下,值可以为空写。

Composite key 
    2000 250     
    2000 150
    2000 90

    2001 100
    2001 80

    2002 500
    2002 120

我的复合键由年份(升序)和学生人数(降序)组成。所以根据我读到的,如果我把键按年份分组,那么在我的减速机中,我应该得到我的输出中每年的最大值,因为我的合成的第二部分是按降序排序的。我不理解这背后的逻辑,因为我看不到键的哪一部分将被发送到reducer,也看不到分组是如何完成的。

whlutmcx

whlutmcx1#

整个钥匙将被送到减速器。这个 GroupingComparator 确定哪些键是“相同”的,以便知道哪些值一起进入对的一个调用中 reduce . 如果您的分组仅按年份分组,则“是”多个键及其所有值将归为一个键 reduce . 我相信你看到的真正的钥匙只会是小组里的第一把钥匙,是的。
我不知道这对你是否有意义。我甚至不知道它是否定义了你得到的键,因为你说在一个组中他们对你来说都是“一样的”。
通常,我使用这种机制来提供一个更快、低级别的比较器实现,而不是使用不寻常的语义。
如果你只想 Reducer 要按排序顺序查看键,它已经可以了。例如,它可以记住最后看到的值。如果你需要从2000开始的所有钥匙 Reducer 例如,这是分区器的作业,而不是分组比较器的作业。

laawzig2

laawzig22#

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

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

在您的例子中,如果您对2001年进行分组,则值100和80将变为零。
如果您编写一个自定义分区器,它将根据您在自定义分区器中给定的键来决定转到reducer的值。

8yparm6h

8yparm6h3#

分组键决定一次调用reduce方法的键部分。

相关问题