【问题标题】:Riak MapReduce Javascript weird outputRiak MapReduce Javascript 奇怪的输出
【发布时间】:2012-11-07 16:54:25
【问题描述】:

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

我相关的 Java sn-p 是:

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函数时:

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

我得到了预期的结果,即一个包含 30 个条目的 json 数组。

任何帮助都会救我,因为我似乎不明白 Riak 中的 MapReduce 是如何工作的。

谢谢!

【问题讨论】:

    标签: java javascript mapreduce riak


    【解决方案1】:

    我怀疑您看到的问题可能是由于在您的 reduce 阶段函数中没有考虑 re-reduce。

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

    为了使用 reduce 函数计算项目数,您需要能够将结果与以前的 reduce 函数与 map 阶段输入区分开来,或者确保它们具有相同的格式并且无论在哪里都可以正确聚合数据来自。

    【讨论】:

    • 您找到了问题所在!一旦我添加了重新减少的逻辑(即考虑了不同的格式),一切都像魅力一样!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多