0

一連の Data の中心移動平均を計算したい。

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  

私は、1 年、つまり 4 四半期分のマッパーの販売額を提供する RecordReader の実装に行き詰まっています。

4

2 に答える 2

3

これは実際、MapReduce パラダイムでは完全に実行可能です。「スライディング ウィンドウ」と考える必要はありません。代わりに、各データ ポイントが最大 4 つの 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)カスタムパーティショナーを実装して、2回の実行で2つの異なるパーティションを作成できるようにします。 各実行で、 レデューサーはさまざまな範囲のデータを取得し、適切な場所で移動平均を計算し
ます
: ...



ここでは、いくつかの Q の移動平均を計算します。

次の実行では、リデューサーは次のようなデータを取得する必要があります: R1: Q1...Q6
R2: Q6...Q10
R3: Q10..Q14

そして残りの移動平均を計算します。
次に、結果を集計する必要があります。

2 つの操作モードを持つカスタム パーティショナーのアイデア - 毎回等しい範囲に分割しますが、多少のシフトがあります。疑似コードでは、次のようになります。
partition = (key+SHIFT) / (MAX_KEY/numOfPartitions) ;
ここで: SHIFT は構成から取得されます。
MAX_KEY = キーの最大値。簡単にするために、それらはゼロから始まると仮定します。

RecordReader、IMHOは特定の分割に限定されており、分割の境界を越えてスライドできないため、解決策ではありません。

もう 1 つの解決策は、入力データを分割するカスタム ロジックを実装することです (これは InputFormat の一部です)。パーティショニングと同様に、2 つの異なるスライドを作成することができます。

于 2012-09-17T08:59:38.680 に答える