Этот пример показывает, как извлечь подмножество большого набора данных.
Существует два аспекта подмножества или выполнения запроса. Каждый выбирает подмножество переменных (столбцы) в наборе данных. Другой выбирает подмножество наблюдений или строки.
В этом примере выбор переменных происходит в определении datastore. (Функция карты могла выполнить дальнейший подвыбор переменных, но это не в рамках этого примера). В этом примере роль функции карты должна выполнить выбор наблюдений. Роль уменьшать функции должна конкатенировать записи из подмножества, извлеченные каждым вызовом функции карты. Этот подход принимает, что набор данных может уместиться в памяти после фазы Карты.
Создайте 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
требует функции карты и уменьшать функции как входные параметры. Картопостроитель получает фрагменты данных и выходных промежуточных результатов. Редуктор читает, промежуточное звено заканчивается и приводит к конечному результату.
В этом примере картопостроитель получает таблицу с переменными, описанными свойством 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
, чтобы применить карту и уменьшить функции до 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'
Смотря на первую запись, Авиарейс U.S. отбыл из логического элемента спустя 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 = 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 наложены, посадка на самолет просто задерживается. Такая задержка обнаружилась бы как исходная задержка. Однако для большинства полетов, выбранных для этого примера, задержки произошли в основном после отклонения от логического элемента, ведя к задержке такси.
Предыдущей функции карты соединили критерии подмножества проводами в функциональном файле. Новая функция карты должна была бы быть записана для любого нового запроса, такого как полеты, отбыв из Сан-Франциско в данный день.
Типичный картопостроитель может быть более адаптивным путем выделения критериев подмножества из определения функции карты и использования анонимной функции, чтобы сконфигурировать картопостроитель для каждого запроса. Этот типичный картопостроитель использует четвертый входной параметр, который предоставляет желаемую переменную запроса.
Отобразите типичный функциональный файл карты.
function subsettingMapperGeneric(data, ~, intermKVStore, subsetter) intermKey = 'Null'; intermVal = data(subsetter(data), :); add(intermKVStore,intermKey,intermVal);
Создайте анонимную функцию, которая выполняет тот же выбор строк, который трудно закодирован в subsettingMapper.m
m.
inFlightDelay150percent = ... @(data) data.Year > 1994 & ... (data.ActualElapsedTime-data.CRSElapsedTime) > 1.50*data.CRSElapsedTime;
Поскольку функция mapreduce
требует карты, и уменьшите функции, чтобы принять точно три входных параметра, используйте другую анонимную функцию, чтобы задать четвертый входной параметр к картопостроителю, subsettingMapperGeneric.m
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.