【问题标题】:Couchbase unique users count per day/month etc每天/每月的 Couchbase 唯一用户数等
【发布时间】:2013-12-24 14:18:22
【问题描述】:

我是 CouchBase 和 Map/reduce 逻辑的新手。我要创建的是一个视图,我可以在其中查看每天/每月/每年/每小时和每天/每月/每年的唯一用户

例如,假设我们插入了以下 JSON 文档:

{
  uid:"user1",
  time: "2013/12/24 18:45"
  city:"London"
  event:"open"
},

{
  uid:"user1",
  time: "2013/12/24 18:46"
  city:"London"
  event:"open"
},

{
  uid:"user2",
  time: "2013/12/24 18:46"
  city:"London"
  event:"open"
}

所以我想要的结果是:

{time:"2013-12-24 18:45", count:1}
{time:"2013-12-24 18:46", count:2}
{time:"2013-12-24 18", count:2} // user1 is considered as uniqu within the hour and counted once

我尝试了以下方法:

地图

function (doc, meta) {
     // date of document   
     var date = new Date(doc.time);

     // Granularity   
     var day = date.getDate();
     var month = date.getMonth();
     var year = date.getFullYear();
     var hour = date.getHours();
     var min = date.getMinutes();

     emit([year, month, day, hour, min], {user: doc.uid, count:1});   
     emit([year, month, day, hour], {user:doc.uid, count:1});   
}

减少

function(key, values, rereduce){
  if(rereduce) return;

  var users = {user: "", count: 0 };

  values.forEach(function(v) {
    for(var k in v) {
      if(!users[k])
        users[k] = 0

      users[k] += v[k];
    }
  });

  return(users);

}

我有两个问题:

当我在 development 模式下运行时,一切正常,我得到以下结果(跳过一些行来美化结果):

{"rows":[
{"key":[2013,11,19,18],"value":{"user":"00user9...skipped...","count":229}},
{"key":[2013,11,19,18,24],"value":{"user":"00user244user9...skipped...","count":228}},
{"key":[2013,11,19,18,25],"value":{"user":"0user804","count":1}}
]
}

但如果我在 full_set 中运行它,我会返回一个错误:

from:
http://127.0.0.1:8092/thomas/_design/dev_uusers/_view/uunsers_per_day?    full_set=true&group=true&stale=false&connection_timeout=60000&limit=10&skip=0
reason:
error (function_clause)

第二个是有更好的方法来返回用户 ID,因为在数百万用户中,这将变得非常内存密集,因为 user 值会变得非常大,对吧?

谢谢

【问题讨论】:

    标签: count mapreduce unique couchbase


    【解决方案1】:

    以下内容并没有很好地减少,但它适用于我大约 300 万条记录,并且会根据只有一次发射的时间段为您提供聚合,其中
    group_level=1 按年份 group_level=2 按月 group_level=3 表示按天等。

    地图

    function (doc, meta) {
        // date of document   
        var date = new Date(doc.time);
    
        // Granularity   
        var day = date.getDate();
        var month = date.getMonth()+1;
        var year = date.getFullYear();
        var hour = date.getHours();
        var min = date.getMinutes();
        var obj ={};
        obj[doc.uid] = 1;
    }
    

    减少

    function (key, values, rereduce) {
    
        var userids = {};
    
        function collate(values) {
            for (userid in values) {
                if (userids[userid])
                  userids[userid] +=values[userid]
                else
                  userids[userid] =values[userid]
            }
        }
        values.forEach(function(partial) {
            collate(partial)
        }); 
    
        return userids; 
    }
    

    不幸的是,进一步减少超出了我的灰色单元格,如果您返回数组而不是对象,并且如果您明智地使用 group_level 它可能会很好地工作,您仍然可以减少内存使用量。

    【讨论】:

      【解决方案2】:

      日志文件 mapreduce_errors 说明了什么? (你可以在这里找到文件 /opt/couchbase/var/lib/couchbase/logs )

      我猜你会看到“reduction_too_long”消息。看看以下几个问题,或许会有所帮助:

      http://www.couchbase.com/issues/browse/MB-7047?page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel

      或在这里:http://www.couchbase.com/forums/thread/newbie-question

      如果您从日志中包含更多信息,我将能够更好地提供帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 2021-03-13
        • 2020-10-02
        • 2017-09-26
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        相关资源
        最近更新 更多