我希望使用mapreduce对时间戳进行预处理,以获得相应的周数,因为数据集有数以亿计的示例需要处理。到目前为止,我已经发现第一个mr作业需要预处理每一行,并根据timestamp作为键,根据行的其余部分作为值进行排序。
然后,第二个作业将相应的日期附加到每个timestamp对象。
但是,我不知道如何执行我需要完成的第三个任务,即创建一个连续的周数时间线。也就是说,如果我的最小时间戳对应于2000年10月3日,我想用数字10来标记它(表示这是2000年的第10周,如果不是在这种情况下,我们假设它是)。假设下一个时间戳对应于2011年1月2日,假设2000年有52周,2011年1月2日是2011年的第5周,我想把这个日期标记为第57周,而不是第5周。我想知道如何在mapreduce中实现这最后一步。假设我有以下输入文件:
sorted_timestamp1::date::vals....
sorted_timestamp2::date::vals...
...
...
...
sorted_timestampn::date::vals.....
简单的伪代码与Map和减少在java将足够我的情况下,实际的代码也将是伟大的。
提前感谢您的帮助!
1条答案
按热度按时间oxf4rvwz1#
我想你可以把这两个问题分开:
1) Map减少逻辑:
你真正想用map reduce计算什么。根据这些信息,您必须选择键值。
我的猜测是:如果你想在一周的水平上做一些聚合,Map器应该把每一行输入(把行号当作一个键)写出来,用新的键表示一周的数据(我将在第2点给你一些注解)。
然后,reducer将所有具有相等的week键的数据集都放在access中,您可以做任何您想做的事情/聚合并写出结果。
2) 周计算:
使用java.util.calendar对象,您可以轻松地计算时间戳/日期的周数。要获得连续周值,可以计算到最小参考日期的周偏移量。为了简单起见,我建议使用1.1。一个有意义的日期。例如,要计算周差,可以使用
joda包静态方法weeks.weeksbetween
如果对“week”键的具体值不是特别感兴趣,那么也可以使用类似的复合键
年*100+周
评估起来简单得多,因此速度更快。如果您真的需要特殊的周时间线,请首先考虑使用simple键(仅用于map reduce中的聚合),然后在reducer生成结果后使用更少的数据进行更昂贵的周时间线评估。
好运+问候
马丁