在我的map reduce程序中,mapper函数将给出两个键值对:
1) (人1,年龄)
2) (人2,年龄)
(为了简单起见,我保留了2对,如果你能解释n行,那就太好了)
现在我想写一个减速器,比较两者的年龄,并给出谁年龄更大的答案。
我无法理解的是,mapper的输出将在文件的不同行中。当reducer在文件上逐行工作时,它将如何比较它们。提前谢谢。
查看以下任何逻辑是否符合您的目的:
A。
-
从地图发射(年龄,个人名称)
-
只有一个减速器-你将以有序的方式获得所有年龄段的人对。所以简单的发射会使第一个成为最年轻的,最后一个成为最年长的。
如果你不想打印所有的值,只需在reduce任务中有两个引用-最年轻的,最古老的-在reduced方法中设置它们,并在reducer任务的清理中发出你想要的任何值
B。
- 让一个映射器按照你说的发射(姓名、年龄)
-
在减速器任务中:
a。使用setup()创建树图
b。在reduce()中,在树图中添加(年龄,个人)
c。你的地图将按年龄排序,你可以在cleanup()中使用它来做一些事情。
本质上,您可以将内部对象中的所有键和值存储在reduce()中,在cleanup()中您可以访问所有这些值并在其中执行您想要的任何逻辑。
我认为您的用例直接适合辅助排序技术。
二次排序是一种技术,用于对映射器发出的"值"进行排序。主要排序将由映射器发出的"键"完成。
如果您尝试在reducer级别对所有值进行排序,可能会导致内存不足。二次排序应在映射程序级别进行。
看看这篇文章
在上面的例子中,只需将"年"替换为"人",将"温度"替换为"年龄"
解决方案:
-
创建自定义分区器,将特定密钥中的所有值发送到单个缩减器
-
排序应该是Key,由mapper发出的Value组合=>创建一个具有Key+Value的组合键已经用于排序。想出一个Comparator,它首先按Key排序,然后按Value进行排序。
在reducer方法中,您所得到的只是一个键和值列表。因此,您可以在该键的值列表中找到最小值或最大值。然而,如果你需要与其他键进行比较,那么你可能应该考虑一个单一的reducer,从映射器中获取所有记录,并在reducer类中借助引用变量而不是局部变量来处理该逻辑,并使用每个键的每个min/max值更新引用变量