主要内容

使用MapReduce的简单数据子集

此示例演示如何提取大型数据集的子集。

子集设置或执行查询有两个方面。一个是选择数据集中变量(列)的子集。另一个是选择观察值的子集或行。

在本例中,变量的选择发生在数据存储的定义中。(map函数可以进一步对变量进行子选择,但这不在本例的范围内)。在本例中,map函数的作用是执行观测值的选择。reduce函数的作用是连接每次调用map函数所提取的子集记录。这种方法假设数据集在Map阶段之后可以装入内存。

准备数据

使用airlinesmall.csv数据集。这个12兆字节的数据集包含29列航空公司的航班信息,包括到达和离开时间。本例使用了数据中29个可用变量中的15个变量。

ds=表格数据存储(“airlinesmall.csv”,“治疗减少”,“NA”);ds。SelectedVariableNames = ds。变量名([1 2 5 9 12 13 15 16 17 ....18 20 21 25 26 27]);ds.选择变量名称
ans=1x15电池第1列至第4列{'Year'}{'Month'}{'DepTime'}{'UniqueCarrier'}第5列至第8列{'actuallapsedtime'}{'CRSElapsedTime'}{'ArrDelay'}{'deptelay'}第9列至第13列{'Origin Dest'}{'taxin'}{'taxin'}{'CarrierDelay'}第14列至第15列{'WeatherDelay'{'NASDelay'}

数据存储处理“NA”值为缺少,并将缺少的值替换为默认值。此外选择变量名称属性允许您仅处理感兴趣的指定变量,您可以使用这些变量进行验证预览.

预览(ds)
ans =8×15表年月DepTime UniqueCarrier ActualElapsedTime CRSElapsedTime ArrDelay DepDelay起源Dest TaxiIn TaxiOut CarrierDelay WeatherDelay NASDelay  ____ _____ _______ _____________ _________________ ______________ ________ ________ _______ _______ ______ _______ ____________ ____________ ________ 1987 10 642{“PS”}53 57 8 12{“宽松”}{‘SJC}南南南南南1987 10 1021{“PS”}63 56 8 1{‘SJC}{“钻”}南南南南南1987 10 2055{“PS”}83 82 21 20{‘圣’}{SMF的}南南南南南1987 10 1332{“PS”}59 58 13 12{“钻”}{‘SJC}南南南南南1987 10 629{“PS”}77 72 4 1 {SMF的}{“宽松”}南南南南南1987 10 1446{“PS”}61 65 59 63{“宽松”}{‘SJC}南南南南南1987 10 859 {'PS'} 155 143 11 -1 {'SEA'} {'LAX'}南南南

运行MapReduce

这个地图还原函数需要一个映射函数和一个reduce函数作为输入。映射器接收数据块并输出中间结果。reducer读取中间结果并生成最终结果。

在本例中,映射器接收一个表,其中包含选择变量名称属性。然后,制图者从登机口提取出延迟时间较长的航班。具体来说,它能识别持续时间超过预定持续时间2.5倍的航班。制图者忽略了1995年以前的飞行,因为本例中涉及的一些变量在1995年以前没有收集。

显示地图功能文件。

函数子设置映射器(数据,~,中间存储)%选择1995年及以后的航班,这些航班的飞行时间非常长%经过的飞行时间(包括在停机坪上的时间和在飞机上的时间)%空气)。idx =数据。年> 1994 &(数据。实际最短时间- data.CRSElapsedTime)...>1.50*data.CRSElapsedTime;intermVal=data(idx,:);add(intermKVStore,“空”,interval);终止

reducer接收从映射器获得的子集观测值,并将它们简单地连接到一个表中。reducer返回一个键(相对来说没有意义)和一个值(连接的表)。

显示reduce函数文件。

函数subsettingReducer (~ intermValList outKVStore)%从列表中获取所有中间结果outVal={};hasnext(intermValList)outVal=[outVal;getnext(intermValList)];终止%请注意,此方法假定连接的中间值(%整个数据的子集)适合内存。添加(outKVStore,“空”, outVal);终止

使用地图还原要将map和reduce函数应用于数据存储,ds.

结果=mapreduce(ds、@subsettingMapper、@subsettingReducer);
*********************************地图缩减进度*********************地图0%缩减0%地图16%缩减0%地图32%缩减0%地图48%缩减0%地图65%缩减0%地图81%缩减0%地图97%缩减0%地图100%缩减0%地图100%缩减100%

地图还原返回输出数据存储,后果,其中包含当前文件夹中的文件。

显示结果

在从数据集中提取的前10个变量中查找模式。这些变量识别航空公司、目的地和到达机场,以及一些基本的延误信息。

r=readall(结果);tbl=r.Value{1};tbl(:,1:10)
ans =37×10表一年一个月时间过去过去一个月时间过去过去一个月时间过去过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去一个月时间过去过去一时间过去过去过去过去过去一段时间过去过去过去一时间时间过去过去过去一段时间时间时间时间时间的时间延迟延迟时间过去过去过去过去过去一时间时间时间时间时间时间时间时间时间时间时间过去过去过去过去过去过去过去过去过去一时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间过去过去过去过去过去过去过去过去过去过去过去一时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间过去过去过去过去过去过去过去过去过去过去过去过去过去过去过去时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间时间过去过去过去过去过去过去过去时间时间时间时间时间时间时间时间时间时间时间时间时间Uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu1997年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年7年5年5 5 5 357 123 244 10{'EWR'}{'CLT'}2002 61759{US}26067192-1{LGA}{BOS}2003 31214{XE}214 124-6{GPT}{IAH}2003 3604{XE}17560114-1{LFT}2003 41556{MQ}142 52 182 92{ORD 2003 551954{US}127 48-1{RDU}2003 12507}⋮

看看第一个记录,一架美国飞机在预定起飞时间后14分钟离开登机口,迟到118分钟。从登机口返回后,航班延迟104分钟,这是实际最短时间CRSElapsedTime.

有一个异常记录。2006年2月,捷蓝航空的航班起飞时间为凌晨3点24分,飞行时间为1650分钟,但到达延迟仅为415分钟。这可能是数据输入错误。

否则,关于这些异常延误的航班何时何地发生,没有明确的模式。没有一家航空公司、一年中的某个时间、一天中的某个时间或单个机场占据主导地位。一些直观的模式,如冬季的奥黑尔(ORD)模式,肯定是存在的。

延迟模式

从1995年开始,航空公司系统性能数据开始包括对航班滑行阶段延迟时间的测量。然后,在2003年,数据也开始包括某些延误的原因。

仔细检查这两个变量。

tbl(:,[1,7,8,11:end])
ans =37×8表年ArrDelay DepDelay TaxiIn TaxiOut CarrierDelay WeatherDelay NASDelay  ____ ________ ________ ______ _______ ____________ ____________ ________ 1995 118 220 7 101南南南1996 54 12 180南南南1997 137 70 2 12南南南南南南1997 243 148 4 1997 115 22 4 98南南南1997 157 95年6 19日南南南1998 146 56 9 47南南南1998 213 3 11 205南南南2000 85 0 5 51南南南2000 244 273南南南4 2002 192 1 6 217南南南2003 124 6 13 131南南南2003 114 106 8南南南2003 182 92 9 106南南南2003 78 1 5 90南南南2003 166 0 11 170 0 0 166⋮

对于这些异常延误的航班,绝大多数延误发生在滑行过程中,在停机坪上。此外,延误的主要原因是纳斯代尔. NAS延误是指国家航空管理局对前往预计无法在航班预定到达时处理所有预定抵达的机场的航班实施的延误。在任何给定时间生效的NAS延迟程序在https://www.fly.faa.gov/ois/.

优选地,当施加NAS延迟时,飞机的登机被简单地延迟。这种延误将表现为起飞延误。然而,对于本例中选择的大多数航班,延误主要发生在登机口起飞后,导致出租车延误。

重新运行MapReduce

先前的map函数在函数文件中硬连接了子集标准。一个新的地图功能将被写入任何新的查询,如航班离开旧金山在给定的一天。

通过将子集条件从映射函数定义中分离出来,并使用匿名函数为每个查询配置映射器,通用映射器可以更具适应性。这个通用映射器使用第四个输入参数来提供所需的查询变量。

显示通用映射函数文件。

函数subsettingMapperGeneric(数据,~,intermKVStore,subsetter)intermKey=“空”;intermVal=数据(子服务器(数据),:);添加(intermKVStore、intermKey、intermVal);终止

创建一个匿名函数,该函数执行与中硬编码相同的行选择subsettingMapper.

inFlightDelay150percent =...@(数据)的数据。年> 1994 &...(data.ActualElapsedTime-data.CRSElapsedTime) > 1.50 * data.CRSElapsedTime;

地图还原函数要求map和reduce函数只接受三个输入,使用另一个匿名函数指定映射器的第四个输入,子类映射泛型。随后,您可以使用此匿名函数调用子类映射泛型只使用三个参数(第四个是隐式的)。

配置标签=...@(data, info, intermKVStore) subsettingMapperGeneric(data, info,...intermKVStore,inflightDelay150%);

使用地图还原将通用映射函数应用于输入数据存储。

结果2=mapreduce(ds,configuredMapper,@subsettingReducer);
*********************************地图缩减进度*********************地图0%缩减0%地图16%缩减0%地图32%缩减0%地图48%缩减0%地图65%缩减0%地图81%缩减0%地图97%缩减0%地图100%缩减0%地图100%缩减100%

地图还原返回输出数据存储,结果2,其中包含当前文件夹中的文件。

验证结果

确认泛型映射器获得与硬连接子集逻辑相同的结果。

r2=readall(result2);tbl2=r2.Value{1};如果isequaln(资源描述,tbl2) disp (“同样的结果与可配置的映射器。”)其他的disp (“哎呀,又得从头开始了。”)终止
与可配置映射器的结果相同。

局部函数

这里列出的是映射和减少函数地图还原应用于数据。

函数子设置映射器(数据,~,中间存储)%选择1995年及以后的航班,这些航班的飞行时间非常长%经过的飞行时间(包括在停机坪上的时间和在飞机上的时间)%空气)。idx =数据。年> 1994 &(数据。实际最短时间- data.CRSElapsedTime)...>1.50*data.CRSElapsedTime;intermVal=data(idx,:);add(intermKVStore,“空”,interval);终止%-------------------------------------------------------------------------函数subsettingReducer (~ intermValList outKVStore)%从列表中获取所有中间结果outVal={};hasnext(intermValList)outVal=[outVal;getnext(intermValList)];终止%请注意,此方法假定连接的中间值(%整个数据的子集)适合内存。添加(outKVStore,“空”, outVal);终止%-------------------------------------------------------------------------函数subsettingMapperGeneric(数据,~,intermKVStore,subsetter)intermKey=“空”;intermVal=数据(子服务器(数据),:);添加(intermKVStore、intermKey、intermVal);终止%-------------------------------------------------------------------------

另见

|

相关话题