在map reduce程序的reducer函数中比较同一文件中的数据



在我的map reduce程序中,mapper函数将给出两个键值对:

1) (人1,年龄)

2) (人2,年龄)

(为了简单起见,我保留了2对,如果你能解释n行,那就太好了)

现在我想写一个减速器,比较两者的年龄,并给出谁年龄更大的答案。

我无法理解的是,mapper的输出将在文件的不同行中。当reducer在文件上逐行工作时,它将如何比较它们。提前谢谢。

查看以下任何逻辑是否符合您的目的:

A。

  1. 从地图发射(年龄,个人名称)

  2. 只有一个减速器-你将以有序的方式获得所有年龄段的人对。所以简单的发射会使第一个成为最年轻的,最后一个成为最年长的。

    如果你不想打印所有的值,只需在reduce任务中有两个引用-最年轻的,最古老的-在reduced方法中设置它们,并在reducer任务的清理中发出你想要的任何值

B。

  1. 让一个映射器按照你说的发射(姓名、年龄)
  2. 在减速器任务中:

    a。使用setup()创建树图

    b。在reduce()中,在树图中添加(年龄,个人)

    c。你的地图将按年龄排序,你可以在cleanup()中使用它来做一些事情。

本质上,您可以将内部对象中的所有键和值存储在reduce()中,在cleanup()中您可以访问所有这些值并在其中执行您想要的任何逻辑。

我认为您的用例直接适合辅助排序技术。

二次排序是一种技术,用于对映射器发出的"值"进行排序。主要排序将由映射器发出的"键"完成。

如果您尝试在reducer级别对所有值进行排序,可能会导致内存不足。二次排序应在映射程序级别进行。

看看这篇文章

在上面的例子中,只需将"年"替换为"人",将"温度"替换为"年龄"

解决方案:

  1. 创建自定义分区器,将特定密钥中的所有值发送到单个缩减器

  2. 排序应该是Key,由mapper发出的Value组合=>创建一个具有Key+Value的组合键已经用于排序。想出一个Comparator,它首先按Key排序,然后按Value进行排序。

在reducer方法中,您所得到的只是一个键和值列表。因此,您可以在该键的值列表中找到最小值或最大值。然而,如果你需要与其他键进行比较,那么你可能应该考虑一个单一的reducer,从映射器中获取所有记录,并在reducer类中借助引用变量而不是局部变量来处理该逻辑,并使用每个键的每个min/max值更新引用变量

相关内容

  • 没有找到相关文章

最新更新