Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算mongodb中的pagerank_Mongodb_Mapreduce_Pagerank - Fatal编程技术网

计算mongodb中的pagerank

计算mongodb中的pagerank,mongodb,mapreduce,pagerank,Mongodb,Mapreduce,Pagerank,我正在尝试在mongodb中使用mapreduce运行pagerank 我的文件采用以下格式: { "_id" : "u: 10000", "value" : [ [ "u: 10000", "s: 985272", 1 ],

我正在尝试在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;
}
当我希望每个文档有多个项目时

有人有什么想法吗?谢谢你的帮助

编辑:


例如,我并不完全满意?。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
            }
        ]
    }
}