如何正确使用couchdb链接mapreduce函数或正确分组

时间:2015-02-09 19:08:29

标签: hadoop mapreduce couchdb

我希望减少我拥有的数据量并在返回之前对其进行预处理,以便只填充计算出的数据。 作为一个简单的示例,我有以下一系列数据,表示给定时间的值,以小时为单位:分钟

var testdata = [ //
    {_id: '01', timestamp: [01, 10], value: 100},
    {_id: '02', timestamp: [01, 20], value: 101},
    {_id: '03', timestamp: [01, 30], value: 102},
    {_id: '04', timestamp: [02, 10], value: 103},
    {_id: '05', timestamp: [02, 20], value: 104},
    {_id: '06', timestamp: [02, 30], value: 105},
    {_id: '07', timestamp: [03, 10], value: 106},
    {_id: '08', timestamp: [03, 20], value: 107},
    {_id: '09', timestamp: [03, 30], value: 108},
    {_id: '10', timestamp: [03, 40], value: 109},
    {_id: '11', timestamp: [04, 10], value: 110},
    {_id: '12', timestamp: [04, 20], value: 111}
];

所以在最低的分组上,我想要得到值的偏差,意思是:

key: 01 value: 100; // 100 - 0 = 100
key: 02 value: 1; // 101-100=1
key: 03 value: 1; // 102-101=1
key: 04 value: 1; // 103-102=1
key: 05 value: 1; // 104-103=1
key: 06 value: 1; //...
key: 07 value: 1; //...
key: 08 value: 1; //...
key: 09 value: 1; //...
key: 10 value: 1; //...
key: 11 value: 1; //...
key: 12 value: 1; //...

我已经不知道如何在couchdb中实现这一点。由于没有更深层次的数据级联,因此无需分组,因此可以“减少”。

下一步是按小时分组,这意味着汇总之前的结果

key: 01 value: 102; // 100+1+1=102
key: 02 value: 3; // 1+1+1=3
key: 03 value: 4; // 1+1+1+1=4
key: 04 value: 2; // 1+1=2

最后一整天的结果将是

key : 01, value: 111;

所以我的问题是,它实际上是否可以在couchdb中执行此类任务,或者我应该只返回绝对值并在客户端执行计算以显示图表?

2 个答案:

答案 0 :(得分:1)

我不确定使用reduce是不可能的,但似乎至少很难。

事实上,你可以不减少使用{ - 1}}功能。与reduce不同,list fns按照确切的顺序接收整个视图结果 - 因此您始终可以知道数据块的开始位置以及它的持续时间。

另一个好处是,您可以在一个API请求中执行所有折叠周期并将所有折叠作为单个对象发送 - 与map / reduce不同,_list fns可以发送任何结构(以及任何mime)的结果。

有关详细信息,请参阅http://docs.couchdb.org/en/latest/api/ddoc/render.html#db-design-design-doc-list-list-name-view-name

答案 1 :(得分:0)

我很确定你无法在Map / Reduce范例中获得delta值。原因是任何两个键/值对可能在reduce阶段不匹配,而在reduce阶段之外,您只能使用单个文档。

另一方面,级联从几分钟到几小时等等应该可以正常工作,但这对你来说可能还不够。