文档

使用MapReduce计算汇总统计的组

这个例子展示了如何计算汇总统计组织组使用mapreduce。它演示了使用一个匿名函数将一个额外的分组参数传递给一个参数化的映射函数。该参数允许您快速重新计算统计数据使用不同的分组变量。

准备数据

创建一个数据存储使用airlinesmall.csv数据集。这个12-megabyte数据集包含29列几个航空公司的航班信息,包括到达和离开的时间。对于这个示例,选择,UniqueCarrier(航空母舰ID)ArrDelay(航班延误)感兴趣的变量。

ds =数据存储(“airlinesmall.csv”,“TreatAsMissing”,“NA”);ds。SelectedVariableNames = {“月”,“UniqueCarrier”,“ArrDelay”};

数据存储处理“NA”值作为失踪,代替缺失值默认值。此外,SelectedVariableNames属性允许您工作感兴趣的只有选定的变量,你可以验证使用预览

预览(ds)
ans = 8月x3表UniqueCarrier ArrDelay _____ _________________ ________ 10“PS”8 10“PS”8 10“PS”21“PS”13 10“PS”4“PS”59 10“PS”3“PS”11

MapReduce运行

mapreduce函数需要一个映射函数reduce函数作为输入。映射器接收到的大量数据和中间结果输出。减速机读取中间结果并产生一个最终的结果。

在这个例子中,每个块的映射器计算分组统计数据和存储数据的中间键值对。每个中间键-值对一个关键的组织水平和细胞数组的值与相应的统计数据。

这张地图函数接受四个输入参数,而mapreduce函数需要map函数接受三个输入参数。调用mapreduce(下图)展示了如何通过这个额外的参数。

显示文件的映射函数。

函数statsByGroupMapper(数据、~ intermKVStore groupVarName)% StatisticsByGroupMapReduceExample映射函数。% 2014年版权MathWorks公司。% n-by-3表数据。首先删除缺失值延迟= data.ArrDelay;组=数据。(groupVarName);notNaN = ~ isnan(延迟);组=组(notNaN);延迟=延迟(notNaN);%在这一块找到独特的组织水平[intermKeys ~, idx] =独特(组,“稳定”);%组延迟通过idx和@grpstatsfun函数应用到每个组intermVals = accumarray (idx、延迟、大小(intermKeys) @grpstatsfun);addmulti (intermKVStore intermKeys intermVals);函数= grpstatsfun (x) n =长度(x);%数m = (x) / n;%的意思v = ((x m) ^ 2)之和/ n;%方差s = ((x m)。^ 3)总和/ n;%偏态没有正常化k = ((x m) ^ 4)之和/ n;%峰度没有正常化出= {[n, m, v,年代,k)};

在映射阶段之后,mapreduce团体中间键值对的唯一键(在这种情况下,航空母舰ID),所以每次调用reduce函数与一家航空公司相关联的值。减速机接收到的中间数据列表输入键(指定的航空公司intermKey)和结合了统计独立的向量:n,,v,年代,k。然后,减速器使用这些向量计算统计,意思是,方差,偏斜度和峰度为单个航空公司。最后的关键是航空公司代码,和相关的值存储在一个与五个领域的结构。

reduce函数文件显示。

函数statsByGroupReducer (intermKey intermValIter outKVStore)% StatisticsByGroupMapReduceExample减速功能。% 2014年版权MathWorks公司。n = [];m = [];v = [];s = [];k = [];%得到所有的中间数据集hasnext (intermValIter)值= getnext (intermValIter);n = [n;值(1)];m = [m;值(2)];v = [v;值(3)];s =[年代;值(4)];k = [k; value(5)];结束%注意,这种方法假设连接中间值符合%在内存中。指的是减速机功能,covarianceReducer,% CovarianceMapReduceExample减少另一种成对的方法%将中间结果数= (n)之和;meanVal = (n。*米)/数总和;d = m - meanVal;方差=(和(n。* v) +和(n。* d。^ 2)) /计数;skewnessVal =(数目(n。* s) + (n。* d。* (3 * v + d。^ 2)))。/方差(计数* ^ (1.5));kurtosisVal =(和k (n。*) +和(n。* d。* (4 * s + 6。* v。* d + d。^ 3))) /(方差数* ^ 2);有价值=结构(“数”数,“的意思是”meanVal,“方差”方差,“偏斜”skewnessVal,“峰度”,kurtosisVal);%将结果添加到输出数据存储添加(outKVStore intermKey、有价值);

使用mapreducemap和reduce函数应用于数据存储,ds。由于参数化映射函数接受四个输入,使用一个匿名函数通过航空母舰id作为第四输入。

outds1 = mapreduce (ds,@(数据、信息、变电站)statsByGroupMapper(数据、信息、变电站、“UniqueCarrier”),@statsByGroupReducer);
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAPREDUCE进展* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *地图地图16%减少0% 32% 0%减少0%减少0%地图48%减少0% 65% 0% 81%减少0%地图地图地图100%减少0% 100% 97%减少0%减少10%地图100%减少21% 100%减少31%地图100%减少41% 100%减少52%地图地图100%减少72% 100% 100%减少62%减少83%地图100%减少93% 100%减少100%

mapreduce返回一个数据存储,outds1在当前文件夹,文件。

阅读的最终结果输出数据存储。

r1 = readall (outds1)
r1 = 29 x2表键值________ _______“PS”[1 x1 struct] TW的[1 x1 struct] UA的[1 x1 struct]“WN”[1 x1 struct]“EA”[1 x1 struct]“惠普”[1 x1 struct]“西北”[1 x1 struct]“PA (1)”[1 x1 struct]“π”[1 x1 struct]“有限公司”[1 x1 struct]“DL”[1 x1 struct]“AA”[1 x1 struct]“我们”[1 x1 struct]”“[1 x1 struct]“毫升(1)”[1 x1 struct]的AQ [1 x1 struct]“MQ”[1 x1 struct]“OO”[1 x1 struct]“XE”[1 x1 struct] ' TZ ' [1 x1 struct]“电动汽车”[1 x1 struct]“FL”[1 x1 struct]“B6”[1 x1 struct]“DH”[1 x1 struct]“哈哈”[1 x1 struct]“哦”[1 x1 struct]“F9”[1 x1 struct] [1 x1 struct]“青年志愿”的9 e [1 x1 struct]

组织的结果

组织更好的结果,包含统计数据的结构转换为一个表和使用承运人id作为行名称。mapreduce返回相同的键-值对的顺序添加到reduce函数,所以通过载体ID对表进行排序。

statsByCarrier = struct2table (cell2mat (r1.Value),“RowNames”,r1.Key);statsByCarrier = sortrows (statsByCarrier,“RowNames”)
statsByCarrier = 29 x5表数均值-方差偏态峰度_____和______说9 e 507 5.3669 1889.5 6.2676 61.706 AA 14578 6.9598 1123 6.0321 93.085 AQ 153 1.0065 230.02 3.9905 28.383 2826 8.0771 717 3.6547 24.083 B6 793 11.936 2087.4 4.0072 27.45公司7999 7.048 1053.8 4.6601 41.038 673 7.575 1491.7 2.9929 15.461 DL 16284 DH EA 875 8.2434 1221.3 5.2955 43.518 7.4971 697.48 4.4746 41.115 1655 EV F9 332 8.4849 1138.6 4.2983 30.742 14.878 10.028 1325.4 2.9347 FL 1248 9.5144 1360.4 3.6277 21.866公顷惠普3597 271 -1.5387 323.27 8.4245 109.63 7.5897 744.51 5.2534 50.004毫升(1)MQ 3805 69 0.15942 169.32 2.8354 16.559 8.8591 1530.5 7.054 105.51西北10097 5.4265 977.64 8.616 172.87哦1414 7.7617 1224 3.57 24.52 OO 3010 5.8618 1010.4 4.4263 32.783 PA(1) 313 5.3738 692.19 3.2061 20.747πPS 82 861 11.252 1121.1 14.751 315.59 5.3902 454.51 2.9682 14.383太瓦3718 7.411 830.76 4.139 30.67 TZ 215 UA 12955 8.3939 1046.6 3.9742 13.758 1.907 814.63 2.8269 28.187 13666 6.8027 760.83 4.6905 47.975 WN 15749 5.4581 562.49 4.0439 30.403 XE 2294 8.8082 827 12.376 2192.6 3.9315 26.446 1410.1 3.7114 23.235青年志愿

改变分组参数

使用一个匿名函数通过分组变量允许您快速重新计算统计数据有不同的分组。

对于这个示例,计算统计数据和组的结果,而不是由承运人id,只需传递变量的匿名函数。

outds2 = mapreduce (ds,@(数据、信息、变电站)statsByGroupMapper(数据、信息、变电站、“月”),@statsByGroupReducer);
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAPREDUCE进展* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *地图地图16%减少0% 32% 0%减少0%减少0%地图48%减少0% 65% 0% 81%减少0%地图地图地图100%减少0% 100% 97%减少0%减少17%地图100%减少33% 100%减少50%地图地图100%减少83% 100% 100%减少67%减少100%

看最后的结果,他们组织成一个表。

r2 = readall (outds2);r2 = sortrows (r2,“关键”);statsByMonth = struct2table (cell2mat (r2.Value));我= {“1月”,2月的,“3”,4月的,“可能”,“君”,“7”,“8月”,“9”,“10月”,11月的,12月的};statsByMonth.Properties。RowNames =我
statsByMonth = 12 x5表数均值-方差偏态峰度专攻说从9870年1月9160年2月8.5954 973.69 4.1142 35.152 7.3275 911.14 4.7241 45.03 10219年3月7.5536 - 976.34 5.1678 - 63.155 9949年4月10180年5月6.0081 1077.4 8.9506 170.52 5.2949 737.09 4.0535 30.069 10340年6月7月10045 10.264 1266.1 4.8777 43.5 8.7797 1069.7 5.1428 64.896 10470年8月7.4522 - 908.64 4.1959 - 29.66 9691年9月10590年10月3.6308 - 664.22 4.6573 - 38.964 4.6059 - 684.94 5.6407 - 74.805 10071年11月10281年12月5.2835 - 808.65 8.0297 - 186.68 10.571 - 1087.6 3.8564 - 28.823

另请参阅

|

相关的话题

这个主题有帮助吗?