2012-11-07 43 views
0

我有一个4个riak节点加载数据的集群。我正在尝试执行一个简单的MapReduce作业,但是我试图通过提供自己的javascript函数(为了移动到更多涉及MapReduce作业)来完成作业。Riak MapReduce Javascript奇怪的输出

我相关的Java代码是:

IndexQuery iq = new IntRangeQuery(IntIndex.named(indexId), bucketId, 11, 40); 
Function mapfunc = new JSSourceFunction(
    streamToString(MapReduceDriver.class.getResourceAsStream("/map_1.js"))); 
Function redfunc = new JSSourceFunction(
    streamToString(MapReduceDriver.class.getResourceAsStream("/reduce_1.js"))); 
PBMapReduceResult result = (PBMapReduceResult) riakClient.mapReduce(iq) 
      .addMapPhase(mapfunc) 
      .addReducePhase(redfunc) 
      .execute(); 

当两个JavaScript功能是:

function map_keepAttr(value, keyData, arg) { 
    var data = Riak.mapValuesJson(value)[0]; 
    return [ data.Attribute_17 ]; 
} 

function reduce_aggregate(values, arg) { 
    return [values.length]; 
} 

我看到的问题是:有是所生产的正是30个值我查询和地图阶段。但减少阶段报告3而不是30(因此不能正确计数)。更奇怪的是,当我使用以下reduce函数时:我得到了预期的结果,即包含正好30个条目的json数组。

任何帮助都会救我,因为我似乎没有得到Riak中的MapReduce如何工作。

谢谢!

回答

1

我怀疑你所看到的问题可能是由于没有考虑你的缩减阶段函数中的重新减少而造成的。虽然地图相位函数每个记录执行一次,但减少相位函数不一定会在全部数据集作为输入执行一次,而是在地图相位输出的部分上执行,而不是一直执行一次,直到处理完所有记录为止。第一次运行reduce函数所产生的结果将包含在发送到下一个调用的数组中。

为了使用reduce函数来统计项目的数量,您需要能够从映射阶段输入中区分以前的reduce函数的结果,或者确保它们具有相同的格式并且可以正确聚合,而不管数据来自哪里。

+0

你发现问题到底是什么!一旦我添加了重新减少的逻辑(即占了不同的格式),一切都像魅力一样工作!谢谢! – gpol