减速器的输入如下
key: 12
List<values> :
1,2,3,2013-12-23 10:21:44
1,2,3,2013-12-23 10:21:59
1,2,3,2013-12-23 10:22:07
所需的输出如下:
1,2,3,2013-12-23 10:21:44,15
1,2,3,2013-12-23 10:21:59,8
1,2,3,2013-12-23 10:22:07,0
请注意最后一栏是10:21:59减去10:21:44。日期(下一个) - 日期(当前)
我尝试加载到内存并减去但是它导致了java堆内存问题。非常感谢您的帮助。该密钥的数据大小是巨大的&gt; 1 GB,无法装入主存储器。
答案 0 :(得分:0)
在你的reduce()
方法中,也许就像这个伪代码一样:
long lastDate = 0;
V lastValue = null;
for (V value : values) {
currentDate = parseDateIntoMillis(value);
if (lastValue != null) {
context.write(key, lastValue.toString() + "," + (currentDate - lastDate));
}
lastDate = currentDate;
lastValue = value;
}
context.write(key, lastValue.toString() + "," + 0);
显然会有整理,但总体思路相当简单。
请注意,由于您要求将下一个值的日期作为当前值计算的一部分,因此通过值的迭代会跳过第一次写入,因此在循环之后进行额外写入以确保考虑所有值。
如果您有任何问题,请随时提出。
答案 1 :(得分:0)
您可以通过以下代码
来完成reduce (LongWritable key, Iterable<String> Values, context){
Date currentDate = null;
LongWritable diff = new LongWritable();
for (String value : values) {
Date nextDate = new Date(value.toString().split(",")[3]);
if (currentDate != null) {
diff.set(Math.abs(nextDate.getTime()-currentDate.getTime())/1000)
context.write(key, diff);
}
currentDate = nextDate;
}
}