我正在处理二级排序问题,请考虑下面的数据,通过值可以为NullWritable。
Composite key
2000 250
2000 150
2000 90
2001 100
2001 80
2002 500
2002 120
我的复合键由年份(升序)和学生人数(降序)组成。因此,根据我读到的内容,如果我按年份对密钥进行分组,那么在我的reducer中,我应该在输出中得到每年的最大值,因为我的复合的第二部分按降序排序。我不明白这背后的逻辑,因为我无法看到密钥的哪一部分将被发送到reducer或分组是如何完成的。
答案 0 :(得分:0)
分组键确定将一次调用reduce方法的键部分。
答案 1 :(得分:0)
整个密钥将被发送到reducer。 GroupingComparator
确定哪些键“相同”以便知道哪些值一起调用reduce
。如果您的分组仅按年份分组,那么是几个键及其所有值,将进入一个reduce
。我相信你看到的实际密钥将只是该组中的第一个,是的。
这对我来说是否有意义我不知道。我甚至不知道它是否定义了你得到的密钥,因为你说它们在一个组内对你来说都是“相同的”。
通常我使用这种机制来提供更快,更低级别的比较器实现,而不是使用不常见的语义。
如果您只是希望Reducer
按排序顺序查看密钥,那么它已经存在。它可以记住它看到的最后一个值。如果您需要以2000开头的所有密钥转到相同的Reducer
,那么这是分区器的工作,而不是分组比较器。
答案 2 :(得分:0)
使用组比较器时,它将确定要用于键的 reduce 方法参数 Iterable values 的值。
Distinct
在您的情况下,如果您在2001年进行分组,则值100和80将消失。
如果您编写了一个自定义分区程序,它将根据您在自定义分区程序中提供的键来决定归入reducer的值。