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