exponenta event banner

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

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

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

См. также

|

Связанные темы