2017-03-24 73 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" 
       } 
      } 
     } 
    } 
])