Простое подмножество данных Используя MapReduce

В этом примере показано, как извлечь подмножество большого набора данных.

Существует два аспекта подмножества или выполнения запроса. Каждый выбирает подмножество переменных (столбцы) в наборе данных. Другой выбирает подмножество наблюдений или строки.

В этом примере выбор переменных происходит в определении datastore. (Функция карты могла выполнить дальнейший подвыбор переменных, но это не в рамках этого примера). В этом примере роль функции карты должна выполнить выбор наблюдений. Роль уменьшать функции должна конкатенировать записи из подмножества, извлеченные каждым вызовом функции карты. Этот подход принимает, что набор данных может уместиться в памяти после фазы Map.

Подготовка данных

Создайте datastore с помощью airlinesmall.csv набор данных. Этот набор данных на 12 мегабайтов содержит 29 столбцов информации о рейсе для нескольких несущих авиакомпании, включая прибытие и время отправления. Этот пример использует 15 переменных из этих 29 переменных, доступных в данных.

ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA');
ds.SelectedVariableNames = ds.VariableNames([1 2 5 9 12 13 15 16 17 ...
    18 20 21 25 26 27]);
ds.SelectedVariableNames
ans = 1x15 cell
  Columns 1 through 4

    {'Year'}    {'Month'}    {'DepTime'}    {'UniqueCarrier'}

  Columns 5 through 8

    {'ActualElapsedTime'}    {'CRSElapsedTime'}    {'ArrDelay'}    {'DepDelay'}

  Columns 9 through 13

    {'Origin'}    {'Dest'}    {'TaxiIn'}    {'TaxiOut'}    {'CarrierDelay'}

  Columns 14 through 15

    {'WeatherDelay'}    {'NASDelay'}

Datastore обрабатывает 'NA' значения как пропавшие без вести и замены отсутствующие значения с NaN значения по умолчанию. Кроме того, SelectedVariableNames свойство позволяет вам работать только с заданными переменными интереса, который можно проверить использование preview.

preview(ds)
ans=8×15 table
    Year    Month    DepTime    UniqueCarrier    ActualElapsedTime    CRSElapsedTime    ArrDelay    DepDelay    Origin      Dest      TaxiIn    TaxiOut    CarrierDelay    WeatherDelay    NASDelay
    ____    _____    _______    _____________    _________________    ______________    ________    ________    _______    _______    ______    _______    ____________    ____________    ________

    1987     10        642         {'PS'}                53                 57              8          12       {'LAX'}    {'SJC'}     NaN        NaN          NaN             NaN           NaN   
    1987     10       1021         {'PS'}                63                 56              8           1       {'SJC'}    {'BUR'}     NaN        NaN          NaN             NaN           NaN   
    1987     10       2055         {'PS'}                83                 82             21          20       {'SAN'}    {'SMF'}     NaN        NaN          NaN             NaN           NaN   
    1987     10       1332         {'PS'}                59                 58             13          12       {'BUR'}    {'SJC'}     NaN        NaN          NaN             NaN           NaN   
    1987     10        629         {'PS'}                77                 72              4          -1       {'SMF'}    {'LAX'}     NaN        NaN          NaN             NaN           NaN   
    1987     10       1446         {'PS'}                61                 65             59          63       {'LAX'}    {'SJC'}     NaN        NaN          NaN             NaN           NaN   
    1987     10        928         {'PS'}                84                 79              3          -2       {'SAN'}    {'SFO'}     NaN        NaN          NaN             NaN           NaN   
    1987     10        859         {'PS'}               155                143             11          -1       {'SEA'}    {'LAX'}     NaN        NaN          NaN             NaN           NaN   

Выполнение mapreduce

mapreduce функция требует функции карты и уменьшать функции как входные параметры. Картопостроитель получает блоки данных и выходные промежуточные результаты. Редуктор читает, промежуточное звено заканчивается и приводит к конечному результату.

В этом примере картопостроитель получает таблицу с переменными, описанными SelectedVariableNames свойство в datastore. Затем картопостроитель извлекает рейсы, которые имели большое количество задержки после pushback от логического элемента. А именно, это идентифицирует рейсы с длительностью, превышающей 2.5 раза продолжительность запланированной длительности. Картопостроитель игнорирует рейсы до 1 995, потому что некоторые представляющие интерес переменные для этого примера не были собраны перед тем годом.

Отобразите файл функции карты.

function subsettingMapper(data, ~, intermKVStore)
  % Select flights from 1995 and later that had exceptionally long
  % elapsed flight times (including both time on the tarmac and time in 
  % the air).
  idx = data.Year > 1994 & (data.ActualElapsedTime - data.CRSElapsedTime)...
    > 1.50 * data.CRSElapsedTime;
  intermVal = data(idx,:);

  add(intermKVStore,'Null',intermVal);
end

Редуктор получает наблюдения из подмножества, полученные из картопостроителя, и просто конкатенирует их в одну таблицу. Редуктор возвращает один ключ (который относительно бессмыслен), и одно значение (конкатенированная таблица).

Отобразите уменьшать файл функции.

function subsettingReducer(~, intermValList, outKVStore)
  % get all intermediate results from the list
  outVal = {};

  while hasnext(intermValList)
    outVal = [outVal; getnext(intermValList)];
  end
  % Note that this approach assumes the concatenated intermediate values (the
  % subset of the whole data) fit in memory.
    
  add(outKVStore, 'Null', outVal);
end

Используйте mapreduce применять map и reduce функции к datastore, ds.

result = mapreduce(ds, @subsettingMapper, @subsettingReducer);
********************************
*      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, result, с файлами в текущей папке.

Отображение результатов

Ищите шаблоны в первых 10 переменных, которые вытянули от набора данных. Эти переменные идентифицируют авиакомпанию, место назначения, и аэропорты прибытия, а также некоторую основную информацию о задержке.

r = readall(result);
tbl = r.Value{1};
tbl(:,1:10)
ans=37×10 table
    Year    Month    DepTime    UniqueCarrier    ActualElapsedTime    CRSElapsedTime    ArrDelay    DepDelay    Origin      Dest  
    ____    _____    _______    _____________    _________________    ______________    ________    ________    _______    _______

    1995      6       1601         {'US'}               162                 58            118          14       {'BWI'}    {'PIT'}
    1996      6       1834         {'CO'}               241                 75            220          54       {'IAD'}    {'EWR'}
    1997      1        730         {'DL'}               110                 43            137          70       {'ATL'}    {'GSP'}
    1997      4       1715         {'UA'}               152                 57            243         148       {'IND'}    {'ORD'}
    1997      9       2232         {'NW'}               143                 50            115          22       {'DTW'}    {'CMH'}
    1997     10       1419         {'CO'}               196                 58            157          19       {'DFW'}    {'IAH'}
    1998      3       2156         {'DL'}               139                 49            146          56       {'TYS'}    {'ATL'}
    1998     10       1803         {'NW'}               291                 81            213           3       {'MSP'}    {'ORD'}
    2000      5        830         {'WN'}               140                 55             85           0       {'DAL'}    {'HOU'}
    2000      8       1630         {'CO'}               357                123            244          10       {'EWR'}    {'CLT'}
    2002      6       1759         {'US'}               260                 67            192          -1       {'LGA'}    {'BOS'}
    2003      3       1214         {'XE'}               214                 84            124          -6       {'GPT'}    {'IAH'}
    2003      3        604         {'XE'}               175                 60            114          -1       {'LFT'}    {'IAH'}
    2003      4       1556         {'MQ'}               142                 52            182          92       {'PIA'}    {'ORD'}
    2003      5       1954         {'US'}               127                 48             78          -1       {'RDU'}    {'CLT'}
    2003      7       1250         {'FL'}               261                 95            166           0       {'ATL'}    {'IAD'}
      ⋮

Смотря на первую запись, американский Авиарейс отбыл из логического элемента спустя 14 минут после его запланированного времени отправления и прибыл 118 минут поздно. Рейс испытал задержку 104 минут после pushback от логического элемента, который является различием между ActualElapsedTime и CRSElapsedTime.

Существует одна аномальная запись. В феврале 2006 рейс JetBlue имел время отправления 3:24 a.m. и прошедшее время полета 1 650 минут, но задержка прибытия только 415 минут. Эта сила быть ошибкой ввода данных.

В противном случае нет никаких ясных шаблонов относительно того, когда и где эти исключительно задержанные рейсы происходят. Никакая авиакомпания, во время года, время суток или один аэропорт не доминирует. Некоторые интуитивные шаблоны, такие как О'Хара (ORD) в зимних месяцах, конечно, присутствуют.

Задержка шаблонов

Начинаясь в 1 995, данные о производительности системы авиакомпании начались включая измерения того, сколько задержки произошло в фазах такси рейса. Затем в 2 003, данные также начали включать определенные причины задержки.

Исследуйте эти две переменные в более близких деталях.

tbl(:,[1,7,8,11:end])
ans=37×8 table
    Year    ArrDelay    DepDelay    TaxiIn    TaxiOut    CarrierDelay    WeatherDelay    NASDelay
    ____    ________    ________    ______    _______    ____________    ____________    ________

    1995      118          14          7        101          NaN             NaN           NaN   
    1996      220          54         12        180          NaN             NaN           NaN   
    1997      137          70          2         12          NaN             NaN           NaN   
    1997      243         148          4         38          NaN             NaN           NaN   
    1997      115          22          4         98          NaN             NaN           NaN   
    1997      157          19          6         95          NaN             NaN           NaN   
    1998      146          56          9         47          NaN             NaN           NaN   
    1998      213           3         11        205          NaN             NaN           NaN   
    2000       85           0          5         51          NaN             NaN           NaN   
    2000      244          10          4        273          NaN             NaN           NaN   
    2002      192          -1          6        217          NaN             NaN           NaN   
    2003      124          -6         13        131          NaN             NaN           NaN   
    2003      114          -1          8        106          NaN             NaN           NaN   
    2003      182          92          9        106          NaN             NaN           NaN   
    2003       78          -1          5         90          NaN             NaN           NaN   
    2003      166           0         11        170            0               0           166   
      ⋮

Для этих исключительно задержанных рейсов значительное большинство задержки происходит во время, выруливают, на гудронированном шоссе. Кроме того, главной причиной задержки является NASDelay. Задержки NAS являются хранениями, наложенными национальными управлениями авиации на отъезды, направившиеся к аэропорту, который, как предсказывают, не может обработать все запланированное прибытие в то время, когда рейс, как планируют, прибудет. Программы задержки NAS в действительности в любой момент времени отправляются в https://www.fly.faa.gov/ois/.

Предпочтительно, когда задержки NAS наложены, посадка на самолет просто задерживается. Такая задержка обнаружилась бы как исходная задержка. Однако для большинства рейсов, выбранных для этого примера, задержки произошли в основном после отклонения от логического элемента, ведя к задержке такси.

Повторное выполнение MapReduce

Предыдущей функции карты соединили критерии подмножества проводами в файле функции. Новая функция карты должна была бы быть записана для любого нового запроса, такого как рейсы, отбыв из Сан-Франциско в данный день.

Типовой картопостроитель может быть более адаптивным путем выделения критериев подмножества из определения функции карты и использования анонимной функции, чтобы сконфигурировать картопостроитель для каждого запроса. Этот типовой картопостроитель использует четвертый входной параметр, который предоставляет желаемую переменную запроса.

Отобразите типовой файл функции карты.

function subsettingMapperGeneric(data, ~, intermKVStore, subsetter)
  intermKey = 'Null';
  intermVal = data(subsetter(data), :);
  add(intermKVStore,intermKey,intermVal);
end

Создайте анонимную функцию, которая выполняет тот же выбор строк, который трудно закодирован в subsettingMapper.

inFlightDelay150percent = ...
   @(data) data.Year > 1994 & ...
   (data.ActualElapsedTime-data.CRSElapsedTime) > 1.50*data.CRSElapsedTime;

Начиная с mapreduce функция требует, чтобы map и reduce функции приняли точно три входных параметров, использовали другую анонимную функцию, чтобы задать четвертый вход к картопостроителю, subsettingMapperGeneric. Впоследствии, можно использовать эту анонимную функцию, чтобы вызвать subsettingMapperGeneric использование только трех аргументов (четвертое неявно).

configuredMapper = ...
    @(data, info, intermKVStore) subsettingMapperGeneric(data, info, ...
    intermKVStore, inFlightDelay150percent);

Используйте mapreduce чтобы применить типовую карту функционируют к входному datastore.

result2 = mapreduce(ds, configuredMapper, @subsettingReducer);
********************************
*      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, result2, с файлами в текущей папке.

Проверка результатов

Подтвердите, что типовой картопостроитель получает тот же результат как с зашитой логикой подмножества.

r2 = readall(result2);
tbl2 = r2.Value{1};

if isequaln(tbl, tbl2)
    disp('Same results with the configurable mapper.')
else
    disp('Oops, back to the drawing board.')
end
Same results with the configurable mapper.

Локальные функции

Перечисленный здесь map и reduce функции что mapreduce применяется к данным.

function subsettingMapper(data, ~, intermKVStore)
  % Select flights from 1995 and later that had exceptionally long
  % elapsed flight times (including both time on the tarmac and time in 
  % the air).
  idx = data.Year > 1994 & (data.ActualElapsedTime - data.CRSElapsedTime)...
    > 1.50 * data.CRSElapsedTime;
  intermVal = data(idx,:);

  add(intermKVStore,'Null',intermVal);
end
%-------------------------------------------------------------------------
function subsettingReducer(~, intermValList, outKVStore)
  % get all intermediate results from the list
  outVal = {};

  while hasnext(intermValList)
    outVal = [outVal; getnext(intermValList)];
  end
  % Note that this approach assumes the concatenated intermediate values (the
  % subset of the whole data) fit in memory.
    
  add(outKVStore, 'Null', outVal);
end
%-------------------------------------------------------------------------
function subsettingMapperGeneric(data, ~, intermKVStore, subsetter)
  intermKey = 'Null';
  intermVal = data(subsetter(data), :);
  add(intermKVStore,intermKey,intermVal);
end
%-------------------------------------------------------------------------

Смотрите также

|

Похожие темы