В этом примере показано, как вычислить среднее значения одной переменной в наборе данных с помощью mapreduce. Он демонстрирует простое использование mapreduce с одним ключом, минимальным вычислением и промежуточным состоянием (накапливая промежуточную сумму и подсчет).
Создание хранилища данных с помощью airlinesmall.csv набор данных. Этот 12-мегабайтный набор данных содержит 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 функция требует функции отображения и функции уменьшения в качестве входных данных. Преобразователь принимает блоки данных и выводит промежуточные результаты. Редуктор считывает промежуточные результаты и выдает окончательный результат.
В этом примере блок отображения находит подсчет и сумму задержек поступления в каждом блоке данных. Затем сопоставитель сохраняет эти значения в качестве промежуточных значений, связанных с ключом. "PartialCountSumDelay".
Отображение файла функции карты.
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 для добавления к выходу одной пары ключ-значение.
Просмотрите файл функции сокращения.
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 для применения карты и сокращения функций к хранилищу данных, 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 относится к данным.
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