Main Content

MapReduce による平均値の計算

この例では、mapreduce を使用してデータ セット内で単一の変数の平均を計算する方法を示します。mapreduce を、単一のキー、最低限の計算および中間状態 (中間合計およびカウントの累積) で使用する簡単な方法を示します。

データの準備

airlinesmall.csv データ セットを使用してデータストアを作成します。この 12 MB のデータ セットには、到着時間と出発時間を含む、いくつかの航空会社のフライト情報が 29 列に含まれます。この例では、ArrDelay (フライト到着遅延時間) を目的の変数として選択します。

ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA');
ds.SelectedVariableNames = 'ArrDelay';

データストアは、既定では 'NA' 値を欠損として扱い、欠損値を NaN 値に置換します。さらに、SelectedVariableNames プロパティにより、選択した目的の変数のみを処理することができ、preview を使用して検査できます。

preview(ds)
ans=8×1 table
    ArrDelay
    ________

        8   
        8   
       21   
       13   
        4   
       59   
        3   
       11   

mapreduce の実行

関数 mapreduce は、入力として map 関数と reduce 関数を必要とします。マッパーはデータのブロックを受け取って中間結果を出力します。リデューサーは中間結果を読み取って最終結果を生成します。

次の例では、マッパーによりデータの各ブロック内の到着遅延時間のカウントと合計を求めます。次にマッパーは、これらの値をキー "PartialCountSumDelay" に関連付けられた中間値として保存します。

map 関数のファイルを表示します。

function meanArrivalDelayMapper (data, info, intermKVStore)
  % Data is an n-by-1 table of the ArrDelay. Remove missing values first:
  data(isnan(data.ArrDelay),:) = [];

  % Record the partial counts and sums and the reducer will accumulate them.
  partCountSum = [length(data.ArrDelay), sum(data.ArrDelay)];
  add(intermKVStore, "PartialCountSumDelay",partCountSum);
end

リデューサーは、マッパーが保存した各ブロックのカウントと合計を受け入れます。そしてこの値を合計して、総カウントと総合計を求めます。全体の平均到着遅延時間は、値を単純に除算したものです。マッパーは単一の一意なキーのみを追加するため、mapreduce は、このリデューサーを一度だけ呼び出します。リデューサーは、add を使用して単一のキーと値のペアを出力に追加します。

reduce 関数のファイルを表示します。

function meanArrivalDelayReducer(intermKey, intermValIter, outKVStore)
  count = 0;
  sum = 0;
  while hasnext(intermValIter)
    countSum = getnext(intermValIter);
    count = count + countSum(1);
    sum = sum + countSum(2);
  end
  meanDelay = sum/count;

  % The key-value pair added to outKVStore will become the output of mapreduce 
  add(outKVStore,"MeanArrivalDelay",meanDelay);
end

mapreduce を使用して、map 関数および reduce 関数をデータストア ds に適用します。

meanDelay = mapreduce(ds, @meanArrivalDelayMapper, @meanArrivalDelayReducer);
********************************
*      MAPREDUCE PROGRESS      *
********************************
Map   0% Reduce   0%
Map  16% Reduce   0%
Map  32% Reduce   0%
Map  48% Reduce   0%
Map  65% Reduce   0%
Map  81% Reduce   0%
Map  97% Reduce   0%
Map 100% Reduce   0%
Map 100% Reduce 100%

mapreduce は、現在のフォルダー内のファイルでデータストア meanDelay を返します。

出力データストア meanDelay から最終結果を読み取ります。

readall(meanDelay)
ans=1×2 table
            Key               Value   
    ____________________    __________

    {'MeanArrivalDelay'}    {[7.1201]}

参考

|

関連するトピック