В этом примере показано, как вычислить среднее значение одной переменной в наборе данных с помощью mapreduce
. Это демонстрирует простое использование mapreduce
с одним ключевым, минимальным расчетом и промежуточным состоянием (накапливающий промежуточную сумму и количество).
Создайте datastore с помощью airlinesmall.csv
набор данных. Этот набор данных на 12 мегабайтов содержит 29 столбцов информации о рейсе для нескольких поставщиков услуг авиакомпании, включая прибытие и время отправления. В этом примере выберите ArrDelay
(задержка прибытия рейса) как переменная интереса.
ds = datastore('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
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
применять map и reduce функции к 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]}
Перечисленный здесь map и reduce функции что 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 %-------------------------------------------------------------------------