Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Riak MapReduce Javascript输出_Java_Javascript_Mapreduce_Riak - Fatal编程技术网

Riak MapReduce Javascript输出

Riak MapReduce Javascript输出,java,javascript,mapreduce,riak,Java,Javascript,Mapreduce,Riak,我有一个由4个riak节点组成的集群,其中加载了数据。我试图执行一个简单的MapReduce作业,它只是聚合,但我试图通过提供我自己的javascript函数来完成它(以便转到更复杂的MapReduce作业) 我的相关Java代码片段是: IndexQuery iq = new IntRangeQuery(IntIndex.named(indexId), bucketId, 11, 40); Function mapfunc = new JSSourceFunction( streamT

我有一个由4个riak节点组成的集群,其中加载了数据。我试图执行一个简单的MapReduce作业,它只是聚合,但我试图通过提供我自己的javascript函数来完成它(以便转到更复杂的MapReduce作业)

我的相关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个值。但reduce阶段报告的是3而不是30(因此计算不正确)。更奇怪的是,当我使用以下reduce函数时:

function reduce_aggregate(values, arg) {
    return values.length;
}
我得到了预期的结果,即一个json数组,正好包含30个条目

任何帮助都可以救我,因为我似乎不知道Riak中的MapReduce是如何工作的


谢谢

我怀疑您看到的问题可能是由于没有考虑reduce phase函数中的re reduce引起的

虽然映射阶段函数每个记录执行一次,但reduce阶段函数不一定以完整数据集作为输入执行一次,而是在映射阶段输出的部分上执行一次,直到所有记录都已处理完毕。第一次运行reduce函数所创建的结果将包含在发送到下一次调用的数组中


为了使用reduce函数计算项数,您需要能够从映射阶段输入中区分先前reduce函数的结果,或者确保它们具有相同的格式,并且无论数据来自何处,都可以正确聚合。

您准确地找到了问题所在!一旦我为re-reduce添加了逻辑(即,考虑了不同的格式),一切都像一个符咒一样工作!谢谢