【发布时间】:2011-03-31 20:11:40
【问题描述】:
我有一个聊天室 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 值“值”的映射器,并且
- 识别每个键(即每天每个区域)的最大值的缩减程序。
这会产生一个类似的文件
2011-01-01/1 11
2011-01-01/2 22
2011-01-02/1 12
2011-01-02/2 20
这会是第二个 M/R 步骤的输入吗?如果是这样,我会将什么作为关键和价值?
我研究过“Hadoop - The Definitive Guide”中的“二级排序”示例,但不确定是否以及如何在此处应用。
是否可以 M/R 到多个输出文件(每个区域一个)?
更新 想了想,我就试试这个:
- 使键成为区域 ID 和值的组合(使用 IntPair?)
- 编写自定义 KeyComparator 和 GroupComparator
【问题讨论】:
标签: java sorting hadoop mapreduce