在reducer中减去日期

y0u0uwnf  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(429)

减速器的输入如下

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堆内存问题。非常感谢你的帮助。此密钥的数据大小非常大,大于1 gb,无法放入主内存。

mccptt67

mccptt671#

也许在你的电脑里有类似伪代码的东西 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);

显然会有整理工作要做,但总的想法是相当简单的。
请注意,由于需要将下一个值的日期作为当前值计算的一部分,因此通过值的迭代会跳过第一次写入,因此在循环之后会进行额外的写入,以确保所有值都被考虑在内。
如果你有什么问题,尽管问吧。

643ylb08

643ylb082#

您可以通过以下代码

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;
}

}

相关问题