主要内容

使用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意味着);结束%---------------------------------------------------------------------------

另请参阅

|

相关的话题