我今天决定尝试使用~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重新处理它,以找出谁写了最无用的评论。我该怎么做呢?我可以将视图导出为另一个表格或其他内容吗?或者我只是以错误的方式思考这个问题?
答案 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可以很容易地找到一个巨魔:)