1

我对地图减少设计很陌生。我使用 mongodb 作为后端和 map reduce 引擎。

在一个简单的数据集上,例如:

day, value

其中值为 -1、0 或 1,我想为每一行添加持续时间,其中持续时间是值等于 1 或 -1的连续天数。

示例输入数据集:

       day| value
2012-01-01|  1
2012-01-02|  1
2012-01-03|  1
2012-01-04| -1
2012-01-05| -1
2012-01-06|  0
2012-01-07|  1
2012-01-08|  1

输出应该是:

       day| value | Duration
2012-01-01|  1    | 0
2012-01-02|  1    | 1
2012-01-03|  1    | 2
2012-01-04| -1    | 0
2012-01-05| -1    |-1
2012-01-06|  0    | 0
2012-01-07|  1    | 0
2012-01-08|  1    | 1

这在地图减少工作中可行吗?

4

1 回答 1

1

如果我错了,有人纠正我,但这对于 MapReduce 来说似乎不可行。我不确定 MongoDB 如何处理其映射器的输入分区,但如果我没记错的话,对于 MapReduce 来说,依赖于先前了解一个映射器块之外的数据的任务是不可能的。

MR 可以在某个块内完成这项工作。假设天 01/01 到 01/02 被发送到一个映射器(来自您的示例)。当然,您可以让它意识到这两天连续具有相同的值。

但是,如果另一个映射器获得 01/03 到 01/04 的天数怎么办?此映射器不会知道第 1 天和第 2 天之前的值与第 3 天相同,因此它只会输出其持续时间为 0。就我而言,无法从不同的映射器获取数据可以看到。

仅使用直接的 java 编码来执行此操作可能会更好。

于 2012-07-03T17:08:18.450 回答