我正在尝试在 mongodb 中使用 mapreduce 运行 pagerank。
我的文件是这种格式:
{
"_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;
}
问题是我不确定 emit 是否会为每个文档产生多个排放。当我得到如下结果时:
{
"_id" : "s: 1000082",
"value" : [
{
"out" : "u: 37317",
"weight" : 1
}
]
}
当我期望每个文档有多个项目时。
有人有想法么?帮助将不胜感激!
编辑:
我并不完全满意,例如这样的事情是如何工作的?reduce 结果看起来一点也不像 emit 输出。