2017-03-24 74 views
0

假设你有一个数据库,每一个文件是从Twitter上发文,你想,与MapReduce的,生成包含另一个文档:包含MapReduce:地图函数中的聚合?

  • 每个国家公布的话
  • 名单鸣叫的次数在这些推文中,用一个计数器来计算该词的总点击次数。这对于每个国家也是如此。

我的问题:聚合和计算map函数上的单词,然后再次使用reduce函数是否正确?像这样做,map函数的输出代表单个推文的信息,reduce函数汇总来自同一个国家的多个推文的信息,但我不知道这是否是一种好的做法MapReduce算法...

预先感谢您!

回答

0

在mongoDB 3.4中,你可以用聚合框架来完成这个过程。

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

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

如果你有MongoDB中的旧版本,那么你必须使用地图,减少程序,但是,有一点,聚合框架快得多在MongoDB中比的map-reduce。

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

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

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

0

从上面的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" 
       } 
      } 
     } 
    } 
])