主要内容

使用MapReduce按组计算平均值

这个例子展示了如何在一个数据集中使用mapreduce.它演示了如何对数据的子组进行计算。

准备数据

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

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

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

预览(ds)
ans =8×2表ArrDelay DayOfWeek ________ _________ 8 3 8 1 21 5 13 5 4 4 59 3 3 4 11 6

MapReduce运行

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

在本例中,映射器按每周的天数计算每个数据块中的延迟次数和和,然后将结果存储为中间键值对。键是整数(1到7),表示一周中的天数,值是两个元素的向量,表示每一天的延迟数和和。

显示map函数文件。

函数meanArrivalDelayByDayMapper(数据、~ intermKVStore)% Data是一个n × 2的表:第一列是DayOfWeek,第二列是DayOfWeek%是ArrDelay。首先删除丢失的值。延迟= data.ArrDelay;一天= data.DayOfWeek;notNaN = ~ isnan(延迟);天= (notNaN);延迟=延迟(notNaN);找出此块中唯一的天数[intermKeys ~, idx] =独特(天,“稳定”);% group delays by idx,并对每个组应用@grpstatsfun函数intermVals = accumarray (idx、延迟、大小(intermKeys) @countsum);addmulti (intermKVStore intermKeys intermVals);函数Out = count (x) n = length(x);%数s = (x)总和;%的意思Out = {[n, s]};结束结束

在Map阶段之后,mapreduce按唯一键(在本例中是星期几)对中间键-值对进行分组。因此,对reducer的每个调用都是针对与一周中的某一天相关联的值进行的。减数器接收由输入键(intermKey),并把这些值加到总数中,n和总金额年代.然后,reducer计算总体平均值,并将最后一个键值对添加到输出中。这个键值对表示一周中某一天的平均航班到达延迟。

显示reduce函数文件。

函数meanArrivalDelayByDayReducer(intermKey, intermValIter, outKVStore) n = 0;s = 0;%得到所有的中间结果集hasnext(intermValIter) intermValue = getnext(intermValIter); / /指定指定的值n = n + intermValue(1);s = s + intermValue(2);结束%累加总和并计数意味着= s / n;将结果添加到输出数据存储添加(intermKey, outKVStore意味着);结束

使用mapreduce要将map和reduce函数应用到数据存储,ds

meanDelayByDay = mapreduce(ds, @meanArrivalDelayByDayMapper,...@meanArrivalDelayByDayReducer);
******************************** * MAPREDUCE的进展  * ******************************** 地图地图16%减少0% 32% 0%减少0%减少0%地图48%减少0% 65%减少0%地图地图97%减少0% 100% 81%减少0%减少0%地图100%减少14% 100%减少29%地图100%减少43% 100%减少57%地图100%减少71%减少100%86%地图100%减少100%

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

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

结果= readall (meanDelayByDay)
结果=7×2表键值  ___ __________ 3 {[7.0038]} 1 {[7.0833]} {[9.4193]} 4 5 6 {[9.3185]} {[4.2095]} 2 {[5.8569]} 7 {[6.5241]}

组织的结果

整数键(1到7)表示一周中的天数。要进一步组织结果,请将键转换为分类数组,从单个元素单元格检索数值,并重命名结果表的变量名。

结果。关键=分类(结果。1:7,关键...“我的”“星期二”“结婚”“星期四”“星期五”“坐”“太阳”});结果。值= cell2mat (result.Value);result.Properties.VariableNames = {“DayOfWeek”“MeanArrDelay”
结果=7×2表DayOfWeek MeanArrDelay _________ ____________星期三7.0038星期一7.0833星期五9.4193星期四9.3185星期六4.2095星期二5.8569太阳6.5241

按平均航班到达延迟对表中的行进行排序。这表明,周六是一周中最适合旅行的一天,而周五则是最糟糕的一天。

结果= sortrows(结果,“MeanArrDelay”
结果=7×2表DayOfWeek MeanArrDelay _________ ____________ Sat 4.2095 Tue 5.8569 Sun 6.5241 Wed 7.0038 Mon 7.0833周四9.3185周五9.4193

本地函数

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

函数meanArrivalDelayByDayMapper(数据、~ intermKVStore)% Data是一个n × 2的表:第一列是DayOfWeek,第二列是DayOfWeek%是ArrDelay。首先删除丢失的值。延迟= data.ArrDelay;一天= data.DayOfWeek;notNaN = ~ isnan(延迟);天= (notNaN);延迟=延迟(notNaN);找出此块中唯一的天数[intermKeys ~, idx] =独特(天,“稳定”);% group delays by idx,并对每个组应用@grpstatsfun函数intermVals = accumarray (idx、延迟、大小(intermKeys) @countsum);addmulti (intermKVStore intermKeys intermVals);函数Out = count (x) n = length(x);%数s = (x)总和;%的意思Out = {[n, s]};结束结束%---------------------------------------------------------------------------函数meanArrivalDelayByDayReducer(intermKey, intermValIter, outKVStore) n = 0;s = 0;%得到所有的中间结果集hasnext(intermValIter) intermValue = getnext(intermValIter); / /指定指定的值n = n + intermValue(1);s = s + intermValue(2);结束%累加总和并计数意味着= s / n;将结果添加到输出数据存储添加(intermKey, outKVStore意味着);结束%---------------------------------------------------------------------------

另请参阅

|

相关的话题