使用MapReduce计算组均值
这个例子展示了如何在一个数据集中使用分组计算平均值mapreduce
.它演示了如何对数据的子组进行计算。
准备数据
方法创建数据存储airlinesmall.csv
数据集。这个12兆字节的数据集包含多家航空公司的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运行
的mapreduce
函数需要map函数和reduce函数作为输入。映射器接收数据块并输出中间结果。减速器读取中间结果并产生最终结果。
在本例中,映射器按每个数据块中的星期几计算延迟计数和总和,然后将结果存储为中间键-值对。键为整数(1 ~ 7),表示星期几,值为两元向量,表示每天的延迟数和延迟数。
显示map函数文件。
函数meanArrivalDelayByDayMapper(data, ~, intermKVStore)% Data是一个n乘2的表:第一列是DayOfWeek,第二列是DayOfWeek%是ArrDelay。首先删除缺失的值。delay = data.ArrDelay;day = data.DayOfWeek;notNaN = ~isnan(延迟);day = day(不是nan);延迟=延迟(notNaN);%找到该块中唯一的天数[intermKeys,~,idx] = unique(天,“稳定”);%组延迟idx,并对每个组应用@grpstatsfun函数intermVals = accumarray(idx,delay,size(intermKeys),@countsum);addmulti (intermKVStore intermKeys intermVals);函数Out = count (x) n = length(x);%数S = sum(x);%的意思Out = {[n, s]};结束结束
在Map阶段之后,mapreduce
按唯一键(在本例中为星期几)对中间键-值对进行分组。因此,对减速器的每次调用都处理与一周中的一天相关的值。减速器收到一个中间计数列表,以及输入键(intermKey
),并把这些数值加到总数中,n
和总和年代
.然后,减速器计算总体平均值,并将最后的键值对添加到输出中。这个键值对表示一周中一天的平均航班到达延迟。
显示reduce函数文件。
函数meanArrivalDelayByDayReducer(intermKey, intervaliter, outKVStore) n = 0;S = 0;得到所有的中间结果而hasnext(interval valiter) intermValue = getnext(interval valiter);n = n + intermValue(1);s = s + intermValue(2);结束累加和计数均值= s/n;将结果添加到输出数据存储添加(intermKey, outKVStore意味着);结束
使用mapreduce
要将map和reduce函数应用到数据存储,ds
.
meanDelayByDay = mapreduce(ds, @meanArrivalDelayByDayMapper,...@meanArrivalDelayByDayReducer);
******************************** * MAPREDUCE PROGRESS * ******************************** Map 0% Reduce 0% Map 16% Reduce 0% Map 32% Reduce 0% Map 48% Reduce 0% Map 65% Reduce 0% Map 81% Reduce 0% Map 97% Reduce 0% Map 100% Reduce 0% Map 100% Reduce 14% Map 100% Reduce 29% Map 100% Reduce 43% Map 100% Reduce 57% Map 100% Reduce 71% Map 100% Reduce 86% Map 100% Reduce 100%
mapreduce
返回一个数据存储,meanDelayByDay
,文件在当前文件夹。
从输出数据存储中读取最终结果,meanDelayByDay
.
result = 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,关键...{“我的”,“星期二”,“结婚”,“星期四”,“星期五”,“坐”,“太阳”});结果。Value = cell2mat(result.Value);result.Properties.VariableNames = {“DayOfWeek”,“MeanArrDelay”}
结果=7×2表DayOfWeek MeanArrDelay _________ ____________ Wed 7.0038 Mon 7.0833 Fri 9.4193 Thu 9.3185 Sat 4.2095 Tue 5.8569 Sun 6.5241
按平均航班到达时间对表中的行进行排序。这表明,周六是一周中最适合旅行的一天,而周五是最差的一天。
结果= sortrows(结果,“MeanArrDelay”)
结果=7×2表DayOfWeek MeanArrDelay _________ ____________ Sat 4.2095 Tue 5.8569 Sun 6.5241 Wed 7.0038 Mon 7.0833 Thu 9.3185 Fri 9.4193
本地函数
这里列出的是map和reduce函数mapreduce
适用于数据。
函数meanArrivalDelayByDayMapper(data, ~, intermKVStore)% Data是一个n乘2的表:第一列是DayOfWeek,第二列是DayOfWeek%是ArrDelay。首先删除缺失的值。delay = data.ArrDelay;day = data.DayOfWeek;notNaN = ~isnan(延迟);day = day(不是nan);延迟=延迟(notNaN);%找到该块中唯一的天数[intermKeys,~,idx] = unique(天,“稳定”);%组延迟idx,并对每个组应用@grpstatsfun函数intermVals = accumarray(idx,delay,size(intermKeys),@countsum);addmulti (intermKVStore intermKeys intermVals);函数Out = count (x) n = length(x);%数S = sum(x);%的意思Out = {[n, s]};结束结束%---------------------------------------------------------------------------函数meanArrivalDelayByDayReducer(intermKey, intervaliter, outKVStore) n = 0;S = 0;得到所有的中间结果而hasnext(interval valiter) intermValue = getnext(interval valiter);n = n + intermValue(1);s = s + intermValue(2);结束累加和计数均值= s/n;将结果添加到输出数据存储添加(intermKey, outKVStore意味着);结束%---------------------------------------------------------------------------
另请参阅
mapreduce
|tabularTextDatastore