MapReduce:聚合地图功能?

时间:2017-03-24 06:51:30

标签: mongodb mapreduce

假设您有一个数据库,其中每个文档都是来自Twitter的推文,并且您希望使用MapReduce生成包含以下内容的另一个文档:

  • 每个国家/地区发布的推文数量
  • 这些推文中包含的单词列表,其中包含一个计算该单词总点击数的计数器。这也适用于每个国家。

我的问题:在地图函数上聚合和计算单词,然后在reduce函数上再次计算是否可以?这样做,map函数的输出表示单个推文的信息,reduce函数汇总来自同一个国家的几条推文的信息,但我不知道这是不是一个好的做法使用MapReduce算法...

提前谢谢!

2 个答案:

答案 0 :(得分:0)

在mongoDB 3.4中,您可以使用聚合框架执行此过程。

对于第一个项目符号,您只需在国家/地区字段中使用$ group运算符并计算推文。

对于第二个项目符号,你必须在推文文本的字段中使用$ split(3.4中的new)运算符,然后在生成的数组中使用$ unwind,最后使用$ group作为_id或country + word作为_id _id。

如果你有一个旧版本的mongodb,那么你必须使用map-reduce程序,但是,请记住,聚合框架比mongodb上的map-reduce快得多。

$ split:https://docs.mongodb.com/manual/reference/operator/aggregation/split/#exp._S_split

$ unwind:https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

$ group:https://docs.mongodb.com/manual/reference/operator/aggregation/group/

答案 1 :(得分:0)

从Moi Syme上面的great answer构建,理想情况下,您将运行以下聚合操作以获得所需的结果:

db.tweets.aggregate([
    { "$project": { "wordList": { "$split": [ "$text", " " ] }, "user.country": 1 } },
    { "$unwind": "$wordList" },
    {
        "$group": {
            "_id": {
                "country": "$user.country",
                "word": "$wordList"
            },
            "count": { "$sum": 1 }
        }
    },
    {
        "$group": {
            "_id": "$_id.country",
            "numberOfTweets": { "$sum": 1 },
            "counts": {
                "$push": {
                    "word": "$_id.word",
                    "count": "$count"
                }
            }
        }
    }
])