gpt4 book ai didi

java - MapReduce(二级)排序/过滤 - 如何?

转载 作者:可可西里 更新时间:2023-11-01 15:00:51 25 4
gpt4 key购买 nike

我有一个聊天室 web 应用程序不同“区域”的时间戳值(并发用户)的日志文件,格式为“时间戳;区域;值”。对于每个区域,每天每分钟存在一个值。

对于每个区域,我想列出每天的最大值,按最大值降序

因此,输入文件为

#timestamp; zone; value
2011-01-01 00:00:00; 1; 10
2011-01-01 00:00:00; 2; 22
2011-01-01 00:01:00; 1; 11
2011-01-01 00:01:00; 2; 21

2011-01-02 00:00:00; 1; 12
2011-01-02 00:00:00; 2; 20

应该为区域 1 生产:

2011-01-02    12
2011-01-01 11

对于区域 2:

2011-01-01    22
2011-01-02 20

我将如何处理这个问题?恕我直言,我需要不止一个 M/R 步骤。

到目前为止我实现的是:

  • 收集文本键“YYYY-MM-DD/Zone”和 IntWritable 值“value”的映射器,以及
  • reducer 识别每个键的最大值(即每天每个区域)。

这会产生一个像

这样的文件
2011-01-01/1    11
2011-01-01/2 22
2011-01-02/1 12
2011-01-02/2 20

这会是第二个 M/R 步骤的输入吗?如果是这样,我会将什么作为键和值?

我已经研究了“Hadoop - 权威指南”中的“二级排序”示例,但我不确定是否以及如何在这里应用它。

是否可以将 M/R 分成多个输出文件(每个区域一个)?

更新想了想,我就试试这个:

  • 使 key 成为 zone-id 和值的组合(使用 IntPair?)
  • 编写自定义 KeyComparator 和 GroupComparator

最佳答案

您可以使用二次排序仅用一个 MR 来完成此操作。以下是步骤

  1. 将键定义为区域 yyyy-mm-dd 的串联,并将值定义为 zone:yyyy-mm-dd:value 正如我将解释的那样,您甚至不需要从映射器发出任何值。 NullWritable 足以满足该值

  2. 实现键比较器,使键的 zone:yyyy-mm-dd 部分按升序排列,值部分按降序排列。这将确保对于给定区域的所有键:yyyy-mm-dd,组中的第一个键将具有最高值

  3. 仅根据键的区域和日期部分定义复合键的分区器和分组比较器,即区域:yyyy-mm-dd。

  4. 在您的 reducer 输入中,您将获得 key 组的第一个 key ,其中将包含区域、日期和该区域、日期组合的最大值。 reducer 输入的值部分将是一个 NullWritable 列表,可以忽略。

关于java - MapReduce(二级)排序/过滤 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5505735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com