【问题标题】:CouchDB - reprocessing view resultsCouchDB - 重新处理视图结果
【发布时间】:2014-03-14 12:35:33
【问题描述】:

我今天决定试用 CouchDB,这里使用了大约 9GB 的 Amazon Review 数据: http://snap.stanford.edu/data/web-Movies.html

我想要做的是找到有史以来最没有帮助的用户。写了最多评论而其他人认为没有帮助的人(他们是亚马逊最伟大的巨魔吗?还是只是令人不快?我想看看)。

我编写了一个 map 函数来查找所有帮助评分差异超过 5 的用户的 userID,然后编写了一个 reduce 函数来对它们求和,以找出它们出现的频率。

// map function:
function(doc){
  var unhelpfulness = doc.helpfulness[1] - doc.helpfulness[0]   
  if(unhelpfulness > 5){
    emit(doc.userId, 1);
  }
}

// reduce function:
function(keys, values){
  return sum(values);
}

这让我看到了 userId :无用评论的数量。

我想获取此输出,然后使用更多 map reduce 对其进行重新处理,以找出谁写的评论最无益。我该怎么做呢?我可以将视图导出为另一个表或其他东西吗?还是我只是以错误的方式思考这个问题?

【问题讨论】:

    标签: mapreduce couchdb


    【解决方案1】:

    你在正确的轨道上。 Couch db 不允许按值对结果进行排序,但它有一个列表函数,可用于对视图的结果执行操作。来自couchdb book

    就像显示函数将文档转换为任意输出格式一样,CouchDB 列表函数允许您以任何格式呈现视图查询的输出。强大的迭代器 API 允许灵活地动态过滤和聚合行,以及输出原始转换,以便轻松制作 Atom 提要、HTML 列表、CSV 文件、配置文件,甚至只是修改后的 JSON。

    所以我们将使用列表来过滤和聚合。在您的设计文档中创建一个这样的列表函数

    function(head, req) 
    {
    
    var row; var rows=[]; 
    
    while(row=getRow()){rows.push(row); } 
    
    rows.sort(function(a,b){return b.value -a.value}); 
    
    send(JSON.stringify(rows[0]));  
    }
    

    现在如果你查询

    /your-database/_design/your-design-doc-name/your-list-name/your-view-name?group=true

    您应该知道评论最无益的人的姓名。 Couch db 可以轻松找到巨魔 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      相关资源
      最近更新 更多