目录
mapreduce函数的功能是用于分析无法载入内存的数据集的编程方法。
语法
outds = mapreduce(ds,mapfun,reducefun)
outds = mapreduce(ds,mapfun,reducefun,mr)
outds = mapreduce(___,Name,Value)
说明
outds = mapreduce(ds,mapfun,reducefun) 将 map 函数 mapfun 应用于输入数据存储 ds,然后将与每个唯一键关联的值传递到 reduce 函数 reducefun。输出数据存储是一个 KeyValueDatastore 对象,该对象指向当前文件夹中的 .mat 文件。
可以使用 outds = mapreduce(ds,mapfun,reducefun,mr) 为 mapreduce 指定运行时配置设置。mr 输入是调用 mapreducer 函数的结果。通常,此参数用于 Parallel Computing Toolbox™、MATLAB® Parallel Server™ 或 MATLAB Compiler™。有关详细信息,请参阅Speed Up and Deploy MapReduce Using Other Products。
outds = mapreduce(___,Name,Value) 使用前面的任何语法指定具有一个或多个 Name,Value 对组参数的其他选项。例如,可以指定 'OutputFolder',后跟指定输出文件夹的路径的字符向量。
示例
统计航空公司的航班
使用 mapreduce 来统计数据集中每个唯一航空公司的航班数量。
使用 airlinesmall.csv 数据集创建一个数据存储。这一 12 MB 的数据集包含多个航空公司的 29 列航班信息,包括到港和离港时间。在此示例中,选择 UniqueCarrier(航空公司名称)作为感兴趣的变量。指定 'TreatAsMissing' 名称-值对组,以便数据存储将 'NA' 值视为缺失,并指定 'MissingValue' 名称-值对组以用零替换缺失值。
ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA',...
'MissingValue',0);
ds.SelectedVariableNames = 'UniqueCarrier';
ds.SelectedFormats = '%C';
预览数据。
preview(ds)
ans=8×1 table
UniqueCarrier
_____________
PS
PS
PS
PS
PS
PS
PS
PS
对数据运行 mapreduce。map 和 reduce 函数统计每个数据块中每个航空公司名称的实例数,然后将这些中间计数合并为最终计数。此方法利用由 mapreduce 执行的使用唯一键作为排序依据的中间排序。函数 countMapper 和 countReducer 包含在此脚本的结尾。
outds = mapreduce(ds, @countMapper, @countReducer);
********************************
* 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 10%
Map 100% Reduce 21%
Map 100% Reduce 31%
Map 100% Reduce 41%
Map 100% Reduce 52%
Map 100% Reduce 62%
Map 100% Reduce 72%
Map 100% Reduce 83%
Map 100% Reduce 93%
Map 100% Reduce 100%
readall(outds)
ans=29×2 table
Key Value
__________ _________
{'AA' } {[14930]}
{'AS' } {[ 2910]}
{'CO' } {[ 8138]}
{'DL' } {[16578]}
{'EA' } {[ 920]}
{'HP' } {[ 3660]}
{'ML (1)'} {[ 69]}
{'NW' } {[10349]}
{'PA (1)'} {[ 318]}
{'PI' } {[ 871]}
{'PS' } {[ 83]}
{'TW' } {[ 3805]}
{'UA' } {[13286]}
{'US' } {[13997]}
{'WN' } {[15931]}
{'AQ' } {[ 154]}
⋮
map 函数 countMapper 利用数据是分类数据这一事实。对每个输入数据块使用 countcats 和 categories 函数来生成航空公司名称和相关计数的键/值对组。
function countMapper(data, info, intermKV)
% Counts unique airline carrier names in each block.
a = data.UniqueCarrier;
c = num2cell(countcats(a));
keys = categories(a);
addmulti(intermKV, keys, c)
end
reduce 函数 countReducer 读取由 map 函数生成的中间数据,并将所有计数相加以得出每个航空公司的单个最终计数。
function countReducer(key, intermValIter, outKV)
% Combines counts from all blocks to produce final counts.
count = 0;
while hasnext(intermValIter)
data = getnext(intermValIter);
count = count + data;
end
add(outKV, key, count)
end
提示
-
调试mapreduce 算法以检查键-值对组如何通过不同的阶段,这很有用。要检查数据的移动,请在 map 和 reduce 函数中设置断点。mapreduce 的断点停止执行,使能够检查相关变量的当前状态,例如 KeyValueStore 或 ValueIterator。
-
一些可在任意平台上优化 mapreduce 性能的建议有:
-
最大限度减少对 map 函数的调用次数。最简单的方法是增大输入数据存储的 ReadSize 属性的值。这样,mapreduce 将较大的数据块传递到 map 函数,降低读取次数,减少数据存储。
-
减少在 map 和 reduce 函数间发送的中间数据量。一种方法是使用 map 函数内的 unique 来组合相似键。
-