我希望预处理时间戳以使用mapreduce获取相应的周数,因为数据集有数亿个需要处理的实例。到目前为止,我已经发现第一个MR作业需要根据时间戳作为键对每行进行预处理和排序,并将行的其余部分作为值进行排序。
然后,第二个作业将相应的日期附加到每个时间戳对象。
但是我不知道如何执行我需要完成的第三项任务,即创建一个连续的周数时间线。意思是,如果我的最小时间戳对应于03/10/2000日期我想标记这个一个数字10(表明这是2000年的第10周,让我们假设它不是在这种情况下。)。然后假设我有下一个时间戳对应于2011年1月1日,如果我们假设在2000年52周,而2011年1月2日是2011年的第5周,我想将此日期标记为第57周和而不是第5周。我想知道如何在mapreduce中实现这最后一步。假设我有以下输入文件:
sorted_timestamp1::date::vals....
sorted_timestamp2::date::vals...
...
...
...
sorted_timestampn::date::vals.....
在java中使用map和reduce的简单伪代码就足够了,实际代码也会很棒。
提前感谢您的帮助!
答案 0 :(得分:1)
我认为你可以分开这两个问题:
1)map reduce逻辑:
你真的想用map reduce计算什么?根据此信息,您必须选择键值。
从我这边猜测:如果你想在每周级别进行一些聚合,那么映射器应该采用每行输入(将行号视为一个键)并用表示周的新键写出数据(我会在第2点给你一些评论。
然后,reducer将拥有访问中具有相同周键的所有数据集,您可以执行任何您想要执行的操作/聚合并将结果写出来。
2)周计算:
使用java.util.Calendar对象,您可以轻松计算时间戳/日期的周。要获得连续的周值,您可以计算到最小参考日期的周偏差。为了简单起见,我建议使用1.1。一个恍惚的约会。要计算周数的差异,您可以使用
Joda package static method Weeks.weeksBetween
如果“周”键的具体值不是特别感兴趣,您也可以使用复合键,如
年* 100 +周
评估起来要简单得多,因此速度更快。如果你真的需要特殊的周时间线考虑首先使用简单的密钥(仅用于map reduce中的聚合),并在reducer以更少的数据生成结果之后执行更昂贵的周时间线评估。
祝你好运+问候
马丁