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]}
参考
mapreduce
| tabularTextDatastore