主要内容

使用MapReduce按组计算汇总统计

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

准备数据

创建数据存储airlinesmall.csv数据集。这个12mb的数据集包含几家航空公司的29列航班信息,包括到达和起飞时间。对于本例,请选择UniqueCarrier(航空公司身份证),以及ArrDelay(航班到达延迟)作为感兴趣的变量。

ds = tabularTextDatastore (“airlinesmall.csv”“TreatAsMissing”“NA”);ds。SelectedVariableNames = {“月”“UniqueCarrier”“ArrDelay”};

数据存储处理“NA”值替换为缺少的值默认值。此外,SelectedVariableNames属性允许您只处理所选的感兴趣的变量,您可以使用这些变量进行验证预览

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

MapReduce运行

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

在本例中,映射器为每个数据块计算分组统计信息,并将统计信息存储为中间键-值对。每个中间键-值对都有一个用于组级别的键和一个包含相应统计信息的值的单元格数组。

这个map函数接受4个输入参数,而mapreduce函数要求map函数接受三个输入参数。调用mapreduce(下面)演示了如何传入这个额外参数。

显示map函数文件。

函数statsByGroupMapper(data, ~, intermKVStore, groupVarName)%数据是一个n × 3的表。首先删除缺失值延迟= data.ArrDelay;组=数据。(groupVarName);notNaN = ~ isnan(延迟);组=组(notNaN);延迟=延迟(notNaN);在这个块中找到唯一的组级别[intermKeys ~, idx] =独特(组,“稳定”);% Group delay by idx,并对每个Group应用@grpstatsfun函数intermVals = accumarray (idx、延迟、大小(intermKeys) @grpstatsfun);addmulti (intermKVStore intermKeys intermVals);函数Out = grpstatsfun(x) n = length(x);%数m = (x) / n;%的意思v = ((x m) ^ 2)之和/ n;%方差s = ((x m)。^ 3)总和/ n;未归一化的偏度%k = ((x m) ^ 4)之和/ n;未归一化的峰度百分比Out = {[n, m, v, s, k]};结束结束

在Map阶段之后,mapreduce通过惟一的键(在本例中是航空公司运营商ID)对中间键-值对进行分组,因此对reduce函数的每个调用都处理与一家航空公司相关联的值。reducer接收由输入键指定的航空公司的中间统计信息列表(intermKey),并将统计数据合并成单独的向量:nv年代,k.然后,减速器使用这些向量来计算单个航线的计数、平均值、方差、偏度和峰度。最后一个键是航空公司代码,关联的值存储在一个包含五个字段的结构中。

显示reduce函数文件。

函数statsByGroupReducer(intermKey, intermValIter, outKVStore) n = [];m = [];v = [];s = [];k = [];%获取所有的中间统计数据hasnext(intermValIter) value = getnext(intermValIter); / /获取下一个值n = [n;值(1)];m = [m;值(2)];v = [v;值(3)];s =[年代;值(4)];k = [k; value(5)];结束请注意,此方法假定连接的中间值是合适的%在内存中。参考减速器函数,协变减速器,的% CovarianceMapReduceExample用于替代的两两减少方法%合并中间结果数= (n)之和;meanVal = (n。*米)/数总和;d = m - meanVal;方差= (sum(n.*v) + sum(n.*d.²))/count;sum(n.*s) + sum(n.*d.)* (3 * v + d。^ 2)))。/方差(计数* ^ (1.5));kurtosisVal = (sum(n.*k) + sum(n.*d.))* (4 * s + 6。* v。* d + d。^ 3)))/(方差数* ^ 2);有价值=结构(“数”数,“的意思是”meanVal,“方差”方差,...“偏斜”skewnessVal,“峰度”, kurtosisVal);%向输出数据存储中添加结果添加(outKVStore intermKey、有价值);结束

使用mapreduce要将map和reduce函数应用到数据存储,ds.由于参数化的map函数接受四个输入,所以使用匿名函数传递航空公司的id作为第四个输入。

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

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

从输出数据存储读取最终结果。

r1 = readall (outds1)
r1 =29日×2表键值  __________ ____________ {' 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 x1struct} {'AQ'} {1x1 struct}⋮

组织的结果

为了更好地组织结果,将包含统计信息的结构转换为表,并使用运营商id作为行名。mapreduce返回键值对的顺序与reduce函数添加键值对的顺序相同,因此按运营商ID对表进行排序。

statsByCarrier = struct2table (cell2mat (r1.Value),“RowNames”, r1.Key);statsByCarrier = sortrows (statsByCarrier,“RowNames”
statsByCarrier =29日×5表数均值-方差偏态峰态  _____ _______ ________ ________ ________ 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 11.936 2826 8.0771 717 3.6547 - 24.083 B6 793 7999 7.048 1053.8 4.6601 41.038 2087.4 4.0072 27.45公司DH 673 16284 7.4971 697.48 4.4746 7.575 1491.7 2.9929 15.461 DL41.115 EA 1655 875 8.2434 1221.3 5.2955 43.518 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⋮

改变分组参数

通过使用匿名函数传入分组变量,可以使用不同的分组快速重新计算统计数据。

对于本例,重新计算统计信息并将结果分组,而不是通过运营商id,通过简单地传递变量转换为匿名函数。

outds2 = mapreduce (ds,...@(数据、信息、变电站)statsByGroupMapper(数据、信息、变电站、“月”),...@statsByGroupReducer);
******************************** * MAPREDUCE的进展  * ******************************** 地图地图16%减少0% 32% 0%减少0%减少0%地图48%减少0% 65%减少0%地图地图97%减少0% 100% 81%减少0%减少0%地图100%减少17% 100%减少33%地图100%减少50% 100%减少67%地图100%减少83%减少100%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×5表数均值-方差偏态峰态  _____ ______ ________ ________ ________ 9870年1月9160年2月8.5954 - 973.69 4.1142 - 35.152 7.3275 - 911.14 4.7241 - 45.03 10219年3月4月9949 7.5536 976.34 5.1678 63.155 30.069 6.0081 1077.4 8.9506 170.52 5.2949 737.09 4.0535 10180年5月6月7月10045 10.264 1266.1 4.8777 43.5 10340 8.7797 1069.7 5.1428 64.896 10470年8月7.4522 908.64 4.1959 29.66 Sep 9691 3.6308 664.22 4.6573 38.964 Oct 10590 4.6059 684.94 5.6407 74.805 Nov 10071 5.2835 808.65 8.0297 186.68 Dec 10281 10.571 1087.6 3.8564 28.823

本地函数

这里列出的是map和reduce函数mapreduce应用于数据。

函数statsByGroupMapper(data, ~, intermKVStore, groupVarName)%数据是一个n × 3的表。首先删除缺失值延迟= data.ArrDelay;组=数据。(groupVarName);notNaN = ~ isnan(延迟);组=组(notNaN);延迟=延迟(notNaN);在这个块中找到唯一的组级别[intermKeys ~, idx] =独特(组,“稳定”);% Group delay by idx,并对每个Group应用@grpstatsfun函数intermVals = accumarray (idx、延迟、大小(intermKeys) @grpstatsfun);addmulti (intermKVStore intermKeys intermVals);函数Out = grpstatsfun(x) n = length(x);%数m = (x) / n;%的意思v = ((x m) ^ 2)之和/ n;%方差s = ((x m)。^ 3)总和/ n;未归一化的偏度%k = ((x m) ^ 4)之和/ n;未归一化的峰度百分比Out = {[n, m, v, s, k]};结束结束%---------------------------------------------------------------------函数statsByGroupReducer(intermKey, intermValIter, outKVStore) n = [];m = [];v = [];s = [];k = [];%获取所有的中间统计数据hasnext(intermValIter) value = getnext(intermValIter); / /获取下一个值n = [n;值(1)];m = [m;值(2)];v = [v;值(3)];s =[年代;值(4)];k = [k; value(5)];结束请注意,此方法假定连接的中间值是合适的%在内存中。参考减速器函数,协变减速器,的% CovarianceMapReduceExample用于替代的两两减少方法%合并中间结果数= (n)之和;meanVal = (n。*米)/数总和;d = m - meanVal;方差= (sum(n.*v) + sum(n.*d.²))/count;sum(n.*s) + sum(n.*d.)* (3 * v + d。^ 2)))。/方差(计数* ^ (1.5));kurtosisVal = (sum(n.*k) + sum(n.*d.))* (4 * s + 6。* v。* d + d。^ 3)))/(方差数* ^ 2);有价值=结构(“数”数,“的意思是”meanVal,“方差”方差,...“偏斜”skewnessVal,“峰度”, kurtosisVal);%向输出数据存储中添加结果添加(outKVStore intermKey、有价值);结束%---------------------------------------------------------------------

另请参阅

|

相关的话题