Mapreduce 如何对具有多个值元素的映射使用couchdb reduce

Mapreduce 如何对具有多个值元素的映射使用couchdb reduce,mapreduce,couchdb,Mapreduce,Couchdb,我似乎在任何地方都找不到答案,所以可能这是不允许的,但我找不到任何couchdb信息来证实这一点。下面是一个场景: 假设一个map函数,在Futon中,我发出一个键的值,例如K(1)。该值由键K(1)的两个独立浮点数A(1)和B(1)组成。我希望对从1到N的所有K(N)执行比率a(N)/B(N)的样本平均值的减少。我在减少函数中经常遇到的问题是“值”参数。每个键都与(a,B)的值对相关联,但我无法从“值”中分离出a,B浮点数 我似乎找不到任何关于如何做到这一点的例子。我已经尝试过访问多级java

我似乎在任何地方都找不到答案,所以可能这是不允许的,但我找不到任何couchdb信息来证实这一点。下面是一个场景:

假设一个map函数,在Futon中,我发出一个键的值,例如K(1)。该值由键K(1)的两个独立浮点数A(1)和B(1)组成。我希望对从1到N的所有K(N)执行比率a(N)/B(N)的样本平均值的减少。我在减少函数中经常遇到的问题是“值”参数。每个键都与(a,B)的值对相关联,但我无法从“值”中分离出a,B浮点数

我似乎找不到任何关于如何做到这一点的例子。我已经尝试过访问多级javascript数组以获取“值”,但它不起作用,下面是我的map函数

功能(doc){
如果(单据['request.ID']){
文件['request.ID'].forEach(功能(需求){
行索引=doc['request.ID'].indexOf(requt);
if(文档资源[行索引]=“Joe Smith”)
emit({rid:reqt},{acthrs:doc['speed.Hours'][row_index],esthrs:doc['Estimate.Total.Hours'][row_index]});
});
}  
}
如果我只是在map函数中生成一个发出a/B的单个元素值的map,我就可以实现这个功能(即avg ratio),但是我对多值元素的情况很好奇

这通常是如何在Futon reduce功能中实现的

我已经在一个for键循环中尝试了各种JSON Javascript符号,例如
values[key index].esthrs[0]
,但我的组合都不起作用


非常感谢。

有两种方法可以解决这个问题;首先,我的建议是更改映射函数,使其更像“键是键,值是值”,在您的特定情况下,这可能意味着,由于您有两个“值”要使用,
花费的.Hours
估计的.Total.Hours
,因此您需要两个视图;虽然可以进行一些欺骗,但在同一视图中,每行发出多个
emit()
,例如:

emit(["Spent.Hours", reqt], doc['Spent.Hours'][row_index]);
emit(["Estimate.Total.Hours", reqt], doc['Estimate.Total.Hours'][row_index]);
使用这种方法,您只需使用预定义的
\u stats
reduce函数

或者,您可以定义一个“智能”统计函数,它可以对更复杂的文档进行统计

标准
\u stats
函数提供计数、求和、平均值和标准偏差。它使用的算法是取值的和、值的平方和以及值的计数;仅凭这些,就可以计算出平均偏差和标准偏差(并嵌入其中,以方便缩小视图)

大致上,这可能看起来像:

function(key, values, rereduce) {
    function getstats(seq, getter) {
        var c, s, s2 = 0, 0, 0;
        values.forEach(function (row) {
            var value = getter(row);
            if (rereduce) {
                c += value.count;
                s += value.sum;
                s2 += value.sumsq;
            } else {
                c += 1;
                s += value;
                s2 += value * value;
            }
        return {
            count: c,
            sum: s,
            sumsq: s2,
            average: s / c,
            stddev: Math.sqrt(c * s2 - s1) / c
        };
    }
    return {esthrs: getstats(function(x){return x.esthrs}),
            acthrs: getstats(function(x){return x.acthrs})};
}


似乎是一个简单的问题,但你所说的
K(1)
符号是什么意思?您确定这个代码示例有意义吗
doc['requt.ID']
实际上是一个列表?您是否尝试为每个发出的行发出一个数值,并将
\u stats
reduce应用到视图中?K(1)表示法只是指向键值的特定实例,其实例编号为1。它的关联值是A(1)和B(1),只是没有使用LaTeX,太懒了。此外,上面的贴图功能也很好,因为它可以生成预期的视图。我遇到的问题是reduce函数。关于你的第二条评论,是的,只发出一个值也可以,同样没有问题。我在Futon reduce函数中为复合“值”指定正确的JSON Javascript表示法(键、值、重减)时遇到了一个具体问题。这与您的问题无关,但通常最好使用JSON对象以外的任何对象作为视图的关键部分;erlang能够保留键顺序,并在哈希表上定义有意义的、稳定的排序,但大多数其他语言没有,最明显的是javascript,您可以在视图中看到它正在使用。对象在值方面很好,但在键方面却很痛苦。考虑使用数组:<代码> EIT([这个,那个],{其他:东西})< /代码>谢谢。我发现有趣的是,Futon中用于减少发射的常规模式似乎不允许出现类似->发射(key,{value1,value2,…valueN})的模式,其中valueN是JSON对象。至少,我似乎找不到任何例子。您的所有备选方案和其他涉及发出单个值对象的方案都可以正常工作,但我有点惊讶于在reduce中使用复合值的特殊情况是如何难以支持的,可能对于多个reduce函数使用一个map函数没有好处,使用一个map B-tree不是更有效吗?