CouchDB - 重新处理视图结果

时间:2014-03-14 12:35:34

标签: mapreduce couchdb

我今天决定尝试使用~9GB的Amazon Review数据来试用CouchDB: http://snap.stanford.edu/data/web-Movies.html

我要做的是找到有史以来最不乐于助人的用户。那些撰写了大量评论但其他人认为无益的人(他们是亚马逊最伟大的巨魔吗?还是只是不愉快?我想看到)。

我已经编写了一个map函数来查找所有用户的userID,这些用户的帮助等级超过5,然后使用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重新处理它,以找出谁写了最无用的评论。我该怎么做呢?我可以将视图导出为另一个表格或其他内容吗?或者我只是以错误的方式思考这个问题?

1 个答案:

答案 0 :(得分:1)

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

  

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

因此我们将使用list来过滤和聚合。在您的设计文档中创建一个类似的列表函数

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可以很容易地找到一个巨魔:)