Вычисление среднего значения с помощью MapReduce

В этом примере показано, как вычислить среднее значение одной переменной в наборе данных с помощью 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   

Запуск MapReduce

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
%-------------------------------------------------------------------------

См. также

|

Похожие темы