tho*_*ers 1 java sorting hadoop mapreduce
我有一个聊天室webapp的不同"区域"的时间戳值(并发用户)的日志文件,格式为"Timestamp; Zone; Value".对于每个区域,每天每分钟存在一个值.
对于每个区域,我想列出每天的最大值,按此最大值排序desc
所以,一个输入文件
#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
Run Code Online (Sandbox Code Playgroud)
应为区域1生产:
2011-01-02 12
2011-01-01 11
Run Code Online (Sandbox Code Playgroud)
对于第2区:
2011-01-01 22
2011-01-02 20
Run Code Online (Sandbox Code Playgroud)
我该如何处理?恕我直言,我需要一个以上的M/R步骤.
到目前为止我实施的是:
这会产生一个类似的文件
2011-01-01/1 11
2011-01-01/2 22
2011-01-02/1 12
2011-01-02/2 20
Run Code Online (Sandbox Code Playgroud)
这是第二次M/R步骤的输入吗?如果是这样,我会把什么作为关键和价值?
我已经研究过"Hadoop - The Definitive Guide"中的"Secondary Sort"示例,但我不确定是否以及如何在此处应用它.
是否可以将M/R分成几个输出文件(每个区域一个)?
更新 在考虑之后,我会尝试这样做:
小智 7
您可以使用二级排序只使用一个MR.这是步骤
将键定义为zone的连接,yyyy-mm-dd和值作为zone:yyyy-mm-dd:value正如我将解释的那样,您甚至不需要从映射器中发出任何值.NullWritable足以满足价值
实现关键比较器,使得区域:键的yyyy-mm-dd部分按升序排序,值部分按降序排序.这将确保对于给定区域的所有键:yyyy-mm-dd,组中的第一个键将具有最高值
根据键的区域和日期部分,即区域:yyyy-mm-dd,定义复合键的分区器和分组比较器.
在您的reducer输入中,您将获得一个密钥组的第一个密钥,该密钥组将包含区域,日期和该区域的最大值,日期组合.reducer输入的值部分是NullWritable列表,可以忽略.
| 归档时间: |
|
| 查看次数: |
3969 次 |
| 最近记录: |