MATLAB中mapreduce函数用法

目录

语法

说明

示例

统计航空公司的航班


        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 来组合相似键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值