В этом примере показано, как вычислить среднее значение одной переменной в наборе данных с помощью mapreduce
. Он демонстрирует простое использование mapreduce
с одной клавишей, минимальным расчетом и промежуточным состоянием (накопление промежуточной суммы и счета).
Создайте datastore с помощью airlinesmall.csv
набор данных. Этот 12-мегабайтный набор данных содержит 29 столбцов информации о рейсе для нескольких авиаперевозчиков, включая время прибытия и вылета. В этом примере выберите ArrDelay
(задержка прибытия рейса) как переменная интереса.
ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA'); ds.SelectedVariableNames = 'ArrDelay';
datastore лечит 'NA'
значения как отсутствующие и заменяет отсутствующие значения на NaN
значения по умолчанию. Кроме того, SelectedVariableNames
свойство позволяет работать только с выбранной интересующей переменной, которую можно проверить используя preview
.
preview(ds)
ans=8×1 table
ArrDelay
________
8
8
21
13
4
59
3
11
The mapreduce
функция требует функции map и функции reduce в качестве входов. mapper получает блоки данных и выводит промежуточные результаты. Редуктор считывает промежуточные результаты и дает конечный результат.
В этом примере mapper находит количество и сумму задержек прибытия в каждом блоке данных. Затем mapper сохраняет эти значения как промежуточные значения, сопоставленные с ключом "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
Редуктор принимает количество и сумму для каждого блока, хранящегося в mapper. Это суммирует значения, чтобы получить общее количество и общую сумму. Общая средняя задержка прибытия является простым делением значений. mapreduce
вызывает этот редуктор только один раз, поскольку mapper добавляет только один уникальный ключ. Редуктор использует add
чтобы добавить одну пару "ключ-значение" к выходу.
Отобразите файл функции сокращения.
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
для применения карты и сокращения функций к datastore, 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
возвращает datastore, meanDelay
, с файлами в текущей папке.
Считайте конечный результат из выхода datastore, meanDelay
.
readall(meanDelay)
ans=1×2 table
Key Value
____________________ __________
{'MeanArrivalDelay'} {[7.1201]}
Вот карта и сокращение функций, которые mapreduce
применяется к данным.
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 %------------------------------------------------------------------------- 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
| tabularTextDatastore