比较地图缩减程序的reducer函数中来自同一文件的数据

时间:2015-10-28 18:29:11

标签: hadoop mapreduce

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

1)(person1,age)

2)(person2,age)

(为了简单起见,我只保留了2对,如果你可以解释n nos行就会很好)

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

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

3 个答案:

答案 0 :(得分:1)

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

一个。

  1. 从地图中发出(年龄,person_name)

  2. 只有1个减速机 - 你将得到所有年龄,人们以有条不紊的方式对。所以简单地发射会给第一个最年轻,最后一个最老。

    如果您不想打印所有值,只需在reducer任务中有两个引用 - 最年轻,最旧 - 在reduce方法中设置它们并在清除reducer任务时发出您想要的任何内容

    < / LI>

    B中。

    1. 如你所说,有一个映射器(姓名,年龄)
    2. 在reducer任务中
    3. 一个。使用setup()创建树图

      湾在reduce()中添加(年龄,人物)在树形图中

      ℃。你的地图将按年龄排序,你可以在清理()中使用它来做些什么。

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

答案 1 :(得分:1)

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

二级排序是一种技术,已被引入以排序&#34;值&#34;由mapper发出。主要排序将由&#34; key&#34;由mapper发出。

如果您尝试在reducer级别对所有值进行排序,则可能会出现内存不足的情况。辅助排序应在映射器级别完成。

看看这个article

在上面的示例中,只需替换&#34;年&#34;与&#34; person&#34;和&#34;温度&#34;与&#34;年龄&#34;

解决方案:

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

  2. 应该完成排序键,mapper发出的值组合=&gt;使用Key + Value创建复合键已用于排序。想出一个比较器,首先按然后用进行排序。

答案 2 :(得分:0)

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