将timestamp转换为weekNumber mapReduce

时间:2014-04-06 05:22:54

标签: java date hadoop mapreduce timestamp

我希望预处理时间戳以使用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的简单伪代码就足够了,实际代码也会很棒。

提前感谢您的帮助!

1 个答案:

答案 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以更少的数据生成结果之后执行更昂贵的周时间线评估。

祝你好运+问候

马丁