计算mongodb中的pagerank
我正在尝试在mongodb中使用mapreduce运行pagerank 我的文件采用以下格式:计算mongodb中的pagerank,mongodb,mapreduce,pagerank,Mongodb,Mapreduce,Pagerank,我正在尝试在mongodb中使用mapreduce运行pagerank 我的文件采用以下格式: { "_id" : "u: 10000", "value" : [ [ "u: 10000", "s: 985272", 1 ],
{
"_id" : "u: 10000",
"value" : [
[
"u: 10000",
"s: 985272",
1
],
[
"s: 985272",
"u: 10000",
1
],
[
"u: 10000",
"s: 303770",
1
],
[
"s: 303770",
"u: 10000",
1
]
]
}
现在我认为第一步是按键收集链接。但是,我每个文档都有几个出站链接。(这些都是双向的)
以下是我的map和reduce函数:
m = function () {
for (var i = 0; i < this.value.length; i++){
var out = {};
out.out = this.value[i][1];
out.weight = this.value[i][2];
emit(this.value[i][0], [out]);
}
}
r = function(key, values){
var result = {
value: []
};
values.forEach(function(val) {
result.value.push({out: val.out, weight: val.weight});
});
return result;
}
当我希望每个文档有多个项目时
有人有什么想法吗?谢谢你的帮助
编辑:
例如,我并不完全满意?。reduce结果与emit输出完全不同。问题在于,您没有映射数组,但reduce试图推送到数组 如果您想让每个键映射到一个由“out”和“weight”对组成的数组,那么您需要发出一个包含该对的数组,在reduce中,您需要将这些数组连在一起 记住 这意味着当映射发出(键、值)时,“值”的结构必须与reduce函数作为结果返回的结构相同 如果将映射函数更改为该值,则该值是一个带有字段“value”的文档,该字段是一个文档数组,每个文档都有字段“out”和字段“weight”: 然后你会得到你期待的回报
{
"_id" : "s: 303770",
"value" : {
"value" : [
{
"out" : "u: 10000",
"weight" : 1
}
]
}
}
{
"_id" : "s: 985272",
"value" : {
"value" : [
{
"out" : "u: 10000",
"weight" : 1
}
]
}
}
{
"_id" : "u: 10000",
"value" : {
"value" : [
{
"out" : "s: 303770",
"weight" : 1
},
{
"out" : "s: 985272",
"weight" : 1
}
]
}
}
问题是您没有映射数组,但reduce正在尝试推送到数组 如果您想让每个键映射到一个由“out”和“weight”对组成的数组,那么您需要发出一个包含该对的数组,在reduce中,您需要将这些数组连在一起 记住 这意味着当映射发出(键、值)时,“值”的结构必须与reduce函数作为结果返回的结构相同 如果将映射函数更改为该值,则该值是一个带有字段“value”的文档,该字段是一个文档数组,每个文档都有字段“out”和字段“weight”: 然后你会得到你期待的回报
{
"_id" : "s: 303770",
"value" : {
"value" : [
{
"out" : "u: 10000",
"weight" : 1
}
]
}
}
{
"_id" : "s: 985272",
"value" : {
"value" : [
{
"out" : "u: 10000",
"weight" : 1
}
]
}
}
{
"_id" : "u: 10000",
"value" : {
"value" : [
{
"out" : "s: 303770",
"weight" : 1
},
{
"out" : "s: 985272",
"weight" : 1
}
]
}
}
你能澄清一下字段值是什么吗?什么是“s”和“u”等?它们只是不同类型的文档(网页)和附带的id…下面的答案是正确的-如果您在向排放值添加更多字段时遇到问题,我建议开始一个新问题。我在答案中添加了一些说明,但我描述的正是您链接的示例的工作原理,所以我不确定你的不满和什么有关。在该示例中,map以author作为键,以“{voces:this.voces}”作为值。在reduce中,它返回“{voates:sum}”,这正是值的结构。对不起,离它还有一天的时间,它就更清楚了。谢谢你的帮助。你能澄清一下字段值是什么吗?什么是“s”和“u”等?它们只是不同类型的文档(网页)和附带的id…下面的答案是正确的-如果您在向排放值添加更多字段时遇到问题,我建议开始一个新问题。我在答案中添加了一些说明,但我描述的正是您链接的示例的工作原理,所以我不确定你的不满和什么有关。在该示例中,map以author作为键,以“{voces:this.voces}”作为值。在reduce中,它返回“{voates:sum}”,这正是值的结构。对不起,离它还有一天的时间,它就更清楚了。谢谢您的帮助。是否每个文档都必须经过缩减步骤?我之所以问这个问题,是因为我在第一个“值”映射中添加了一个秩值,但它只出现在一些文档中
r=function(key,values){result={rank:1.0,value:[]};for(values中的var i){result.value=values[i].value.concat(result.value);}return result;}
每个文档都会被映射-您必须从映射中发出与reduce函数返回的格式相同的结果。等等,这样的工作原理是什么?->。reduce的结果一点也不像emit output.map输出(key,value)对-reduce必须返回与“value”格式相同的格式-关键部分是隐式的。我猜在finalize阶段需要计算排名。但作为一个单独的问题进行分类会更容易。如果您没有将“排名”添加到地图随每个键发出的内容中,则您发布的缩减功能不太可能是正确的。是否每个文档都必须经过缩减步骤?我之所以问这个问题,是因为我在第一个“值”映射中添加了一个秩值,但它只出现在一些文档中r=function(key,values){result={rank:1.0,value:[]};for(values中的var i){result.value=values[i].value.concat(result.value);}return result;}
每个文档都会被映射-您必须从映射中发出与reduce函数返回的格式相同的结果。等等,这样的工作原理是什么?->。reduce的结果一点也不像emit output.map输出(key,value)对-reduce必须返回与“value”格式相同的格式-关键部分是隐式的。我猜在finalize阶段需要计算排名。但作为一个单独的问题进行分类会更容易。如果您没有将“rank”添加到地图随每个键发出的内容中,则您发布的reduce函数不太可能是正确的。
function (key, values) {
result = {value:[]};
for (var i in values) {
result.value = values[i].value.concat(result.value);
}
return result;
}
{
"_id" : "s: 303770",
"value" : {
"value" : [
{
"out" : "u: 10000",
"weight" : 1
}
]
}
}
{
"_id" : "s: 985272",
"value" : {
"value" : [
{
"out" : "u: 10000",
"weight" : 1
}
]
}
}
{
"_id" : "u: 10000",
"value" : {
"value" : [
{
"out" : "s: 303770",
"weight" : 1
},
{
"out" : "s: 985272",
"weight" : 1
}
]
}
}