了解MapReduce關鍵兩個步驟;
首先是構想出結構的資料結構,這種資料結構可以支撐你的業務分析使用;是要了解這種模式的處理元素。
第二步,分析原始資料的結構是怎樣的;
第三步,基于原始資料結構以及目标資料結構,在分析map的實作邏輯,傳回值什麼,sort-shuffle之後的值什麼,這個值也是reduce的入口參數,然後是reduce的邏輯是什麼,以符合目标結構;
map和reduce在處理資料上面的很大差别在于map之後會有一個彙總過程,按照key進行彙聚(發生在sort-shuffle階段);reduce産生的資料不會再有這個過程,産生的是什麼資料,加入到集合中之後,這個資料集合再無其他操作;如果再次把這個資料集合作為下一個階段的Map-Reduce。
對于"購買過該商品的使用者還購買了哪些商品",這個需求,分析過程如下:
0. 目标資料結構是:key:商品(主體);value:關聯商品+權值(數量)清單;
1. 實作要明白map的入口參數是什麼樣子,使用者對應一個商品;
2. 分析一下map之後資料,是一個商品對應多個商品;
3. shuffle沒有什麼特别處理;
3. reduce沒有什麼特别處理;
下面是第二輪mapreduce:
1. 入口參數是一個使用者對多個商品;
2. map傳回值某個使用者的某個商品對應多個相關聯的商品;
3. map之後shuffle合并是個集合,集合中的元素是:key是某個商品,value是相關聯的商品List,此時這個list裡面可能會有很多重複項;
4. reduce的入口參數是上步中介紹的内容;reduce處理之後,變成了key:某個商品;value:關聯商品以及該商品的累加個數;
下面的是應用:基于reduce處理的資料,我們可以獲得某個商品關聯度最高的前N個商品(累加個數最高的N的)
處理的全流程如下圖所示:

注意其實處理的次元的變化,階段1map的處理次元還是在user;到了階段兒的map處理次元是使用者+商品,到了階段2的reduce就抛棄了使用者了,而是完全在商品的次元了;reduce的一個功能就是"降維",這個是我的一個說法,其實"降維"是指原本的key不管了,而是從value中在建立一套key-value資料結構;因為reduce功能是group,group意味着可以抛棄一個資料次元,或者說忽略某些個資料次元。
繼續,對于"經常一起購買的商品":
0. 構想目标資料結構:key:商品;value:關聯商品+權值清單;
1. 你要原始的資料集合中,一條記錄的結構是交易-産品清單;
2. 在map階段,直接"降維",抛棄key(交易ID),對于産品清單做兩兩配對;shuffle之後的資料集合的元素結構是[<p1,p2>, 1];
3. 到了reduce階段,就是按照<p1, p2>進行彙聚,輸出的是資料集合的元素結構是[<p1, p2>, n];
應用:
找到p1=XX,n最高的3個産品作為推薦。
第三波,難度比較大了,推薦好友,A和B是好友,B是C的好友,那麼AC要雙向推薦一下。
我最初的想法是做差集;A-B的人向B做推薦,B-A的人想A做推薦;但是這樣算法無法擷取共同好友,我們登入QQ看到推薦的時候,一般都會看到你和以下人是好友;
0. 構想目标資料結構,key:主體人,value:[推 薦者,List<共同好友>]
1. 原始資料結構:key:主體人,value:List<Friends>
2. map輸出的是key:被推薦人;value:[推薦好友, 共同好友(入參的主體人)];shuffle之後是key是推薦人;value推薦好友清單;