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

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

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

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

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

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

ds = datastore('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 array

  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 =

  8x15 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).

% Copyright 2014 The MathWorks, Inc.

idx = data.Year > 1994 & (data.ActualElapsedTime - data.CRSElapsedTime)...
    > 1.50 * data.CRSElapsedTime;
intermVal = data(idx,:);

add(intermKVStore,'Null',intermVal);

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

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

function subsettingReducer(~, intermValList, outKVStore)
% Reducer function for the SubsettingMapReduceExample 

% Copyright 2014 The MathWorks, Inc.

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

Используйте 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 =

  37x10 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'
    2003      8       2010          'AA'                339                115            406          182      'BHM'     'DFW'
    2004      3       1238          'MQ'                184                 69            115            0      'AMA'     'DFW'
    2004      7       1730          'DL'                241                 68            173            0      'DCA'     'LGA'
    2004      8       1330          'XE'                204                 80            124            0      'HRL'     'IAH'
    2005      7       1951          'MQ'                251                 97            345          191      'RDU'     'JFK'
    2005     10        916          'MQ'                343                 77            266            0      'LIT'     'DFW'
    2006      2        324          'B6'               1650                199            415        -1036      'BOS'     'FLL'
    2006      5       1444          'CO'                167                 60            131           24      'IAH'     'SAT'
    2006      5       1250          'DL'                148                 59            109           20      'DCA'     'LGA'
    2006      7       1030          'WN'                211                 80            226           95      'PIT'     'MDW'
    2006      7       1424          'MQ'                254                 69            259           74      'LGA'     'DCA'
    2006     11       2147          'UA'                222                 77            160           15      'DEN'     'ICT'
    2006     11       1307          'AA'                175                 60            132           17      'DFW'     'AUS'
    2007     10       1141          'OO'                137                 54            107           24      'PIA'     'ORD'
    2008      1       1027          'MQ'                139                 55             96           12      'MLI'     'ORD'
    2008      1       2049          'MQ'                151                 60            175           84      'AZO'     'ORD'
    2008      2        818          'WN'                280                 95            198           13      'MHT'     'BWI'
    2008      4       1014          'CO'                151                 58             92           -1      'SAT'     'IAH'
    2008      6       2000          'OH'                263                104            204           45      'JFK'     'BOS'
    2008      6       1715          'AA'                271                 90            201           20      'RDU'     'LGA'
    2008     11       1603          'XE'                183                 73            124           14      'BTR'     'IAH'

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

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

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

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

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

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

tbl(:,[1,7,8,11:end])
ans =

  37x8 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   
    2003      406          182       242         10            0               0           224   
    2004      115            0         6         61            0               0           115   
    2004      173            0         5        161            0               0           173   
    2004      124            0         9        102            0               0           124   
    2005      345          191        54        125            0               0           345   
    2005      266            0        13        183            0               0           266   
    2006      415        -1036         4         12           14               0            11   
    2006      131           24         7        118            0               6           107   
    2006      109           20         4        105           20               0            89   
    2006      226           95         5        130            0               0           226   
    2006      259           74         6        208           39               0           185   
    2006      160           15         3        158           15               0           145   
    2006      132           17         4        127            0              17           115   
    2007      107           24         7        100            0               0           107   
    2008       96           12        25         72            0               0            96   
    2008      175           84        12        107            0               0            91   
    2008      198           13         4        190            0               0           185   
    2008       92           -1         9         93            0               0            92   
    2008      204           45        12        212            0              45           159   
    2008      201           20         4        193            0               0           201   
    2008      124           14        12         93            0               0           110   

Для этих исключительно задержанных рейсов значительное большинство задержки происходит во время, выруливают, на гудронированном шоссе. Кроме того, главной причиной задержки является 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);

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

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

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

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.

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

|

Похожие темы