В этом примере показано, как извлечь подмножество большого набора данных.
Существует два аспекта подмножества или выполнения запроса. Каждый выбирает подмножество переменных (столбцы) в наборе данных. Другой выбирает подмножество наблюдений или строки.
В этом примере выбор переменных происходит в определении 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=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
функция требует функции карты и уменьшать функции как входные параметры. Картопостроитель получает блоки данных и выходные промежуточные результаты. Редуктор читает, промежуточное звено заканчивается и приводит к конечному результату.
В этом примере картопостроитель получает таблицу с переменными, описанными 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 и прошедшего времени полета 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 наложены, посадка на самолет просто задерживается. Такая задержка обнаружилась бы как исходная задержка. Однако для большинства рейсов, выбранных для этого примера, задержки произошли в основном после отклонения от логического элемента, ведя к задержке такси.
Предыдущей функции карты соединили критерии подмножества проводами в файле функции. Новая функция карты должна была бы быть записана для любого нового запроса, такого как рейсы, отбыв из Сан-Франциско в данный день.
Типовой картопостроитель может быть более адаптивным путем выделения критериев подмножества из определения функции карты и использования анонимной функции, чтобы сконфигурировать картопостроитель для каждого запроса. Этот типовой картопостроитель использует четвертый входной параметр, который предоставляет желаемую переменную запроса.
Отобразите типовой файл функции карты.
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 %-------------------------------------------------------------------------