这个例子展示了如何在一个数据集中使用mapreduce
.它演示了如何对数据的子组进行计算。
创建数据存储airlinesmall.csv
数据集。这个12mb的数据集包含几家航空公司的29列航班信息,包括到达和起飞时间。在本例中,选择DayOfWeek
和ArrDelay
(航班到达延迟)作为感兴趣的变量。
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
函数需要一个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意味着);结束%---------------------------------------------------------------------------
mapreduce
|tabularTextDatastore