0

我想计算一组 Data 的 Centered Moving average。

Example Input format :

quarter | sales      
Q1'11   | 9            
Q2'11   | 8
Q3'11   | 9
Q4'11   | 12
Q1'12   | 9
Q2'12   | 12
Q3'12   | 9
Q4'12   | 10

数据的数学表示和计算移动平均然后居中移动平均

Period   Value   MA  Centered
1          9
1.5
2          8
2.5              9.5
3          9            9.5
3.5              9.5
4          12           10.0
4.5              10.5
5          9            10.750
5.5              11.0
6          12
6.5
7          9  

我坚持实施 RecordReader,它将提供一年的映射器销售价值,即四个季度。

4

2 回答 2

3

这实际上在 MapReduce 范式中是完全可行的;它不必被认为是一个“滑动窗口”。相反,请考虑每个数据点与最多四个 MA 计算相关的事实,并记住对 map 函数的每次调用都可以发出多个键值对。这是伪代码:

First MR job:

map(quarter, sales)
    emit(quarter - 1.5, sales)
    emit(quarter - 0.5, sales)
    emit(quarter + 0.5, sales)
    emit(quarter + 1.5, sales)

reduce(quarter, list_of_sales)
    if (list_of_sales.length == 4):
        emit(quarter, average(list_of_sales))
    endif


Second MR job:

map(quarter, MA)
    emit(quarter - 0.5, MA)
    emit(quarter + 0.5, MA)

reduce(quarter, list_of_MA)
    if (list_of_MA.length == 2):
        emit(quarter, average(list_of_sales))
    endif
于 2012-09-17T21:24:18.120 回答
1

据我所知,移动平均值并不能很好地映射到 MapReduce 范式,因为它的计算本质上是排序数据上的“滑动窗口”,而 MR 正在处理排序数据的非相交范围。
我看到的解决方案如下:
a)实现自定义分区器,以便能够在两次运行中创建两个不同的分区。 在每次运行中,您 的 减速器
将获得不同范围的数据并在适当的位置计算移动平均值 ...




在这里,您将计算一些 Q 的移动平均线。

在下一次运行中,您的减速器应该得到如下数据: R1:Q1...Q6
R2:Q6...Q10
R3:Q10..Q14

并计算其余的移动平均线。
然后,您将需要汇总结果。

自定义分区器的想法,它将具有两种操作模式 - 每次划分为相等的范围但有一些变化。在伪代码中,它看起来像这样:
partition = (key+SHIFT) / (MAX_KEY/numOfPartitions) ;
其中: SHIFT 将从配置中获取。
MAX_KEY = 密钥的最大值。为简单起见,我假设它们从零开始。

RecordReader,恕我直言,它不是一个解决方案,因为它仅限于特定的拆分并且不能滑过拆分的边界。

另一种解决方案是实现拆分输入数据的自定义逻辑(它是 InputFormat 的一部分)。可以做两张不同的幻灯片,类似于分区。

于 2012-09-17T08:59:38.680 回答