MongoDB:MapReduce基礎及實例


背景

     MapReduce是個非常靈活和強大的數據聚合工具。它的好處是可以把一個聚合任務分解為多個小的任務,分配到多服務器上並行處理。

MongoDB也提供了MapReduce,當然查詢語肯定是JavaScript。MongoDB中的MapReduce主要有以下幾階段:

   1. Map:把一個操作Map到集合中的每一個文檔

   2. Shuffle: 根據Key分組對文檔,並且為每個不同的Key生成一系列(>=1個)的值表(List of values)。

   3. Reduce: 處理值表中的元素,直到值表中只有一個元素。然后將值表返回到Shuffle過程,循環處理,直到每個Key只對應一個值表,並且此值表中只有一個元素,這就是MR的結果。

   4. Finalize:此步驟不是必須的。在得到MR最終結果后,再進行一些數據“修剪”性質的處理。

MongoDB中使用emit函數向MapReduce提供Key/Value對。

Reduce函數接受兩個參數:Key,emits. Key即為emit函數中的Key。 emits是一個數組,它的元素就是emit函數提供的Value。

Reduce函數的返回結果必須要能被Map或者Reduce重復使用,所以返回結果必須與emits中元素結構一致。

Map或者Reduce函數中的this關鍵字,代表當前被Mapping文檔。

實例

  測試數據: 這個集合是三個用戶購買的產品和產品價格的數據。

Code

1. 每個用戶各購買了多少個產品?( <單一key做mr< strong> )

Code

2. 每個用戶不同的產品購買了多少個?(復合Key做MR)

Code

3. 每個用戶購買的產品數量,總金額是多少?(復合Reduce結果處理)

Code

4. 在3中返回的amount的float精度需要改成兩位小數,還需要得到商品的平均價格。(使用Finalize處理reduce結果集)

Code

5. 統計單價大於6的SKU,每個用戶的購買數量.(篩選數據子集做MR)

  這個比較簡單了,只需要將1.中調用MR時加上篩選查詢即可,其它不變.

Code

總結

   MongoDB中的MR工具非常強大,文中的例子只是基礎實例.結合Sharding后,多服務器並行做數據集合處理,才能真正顯現其能力.

   如果后續有時間,希望能總結和分享更多關於MongoDB,關於SQL Server的東西.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM