一、在map端的輸出中,將須要排序的字段做爲key。那麼到達reduce時,相同的key會做爲一組排在一塊兒的數據。 注意:若是key是本身組裝的javabean,那麼這個javabean必定要實現writableandcompareble 而且重寫裏面的對應方法。java
二、在reduce端,因爲上述的信息都排成一一組並且有序,那麼 若是是TOPOne,只須要輸出第一個就夠了, 若是是TOPN,只須要循環輸出前N個就好了。算法
思路:這個問題的分紅兩步,也就是兩個MapReduce程序。code
第一個MapReduce中,map端以用戶的id做爲key,直接傳輸給reduce,那麼在reduce端中,相同的用戶id會作爲一組排在一塊兒的數據,只須要將他們的每月的流量加起來,最後才輸出總流量這一條數據就能夠了。排序
第二個MapReduce中,就是求TOPOne和TOPN的問題了。hash
使用場景:大表join大表it
思路:table
在map端自定義一個javabean,讀取每一行文件的時候,就在這個javabean中記錄這一行的信息以及它來自那個表,最後以id做爲key,以javabean做爲value傳輸給reduce端hashmap
reduce端拿到一組key後,遍歷這些value,找到來自於須要join的信息,存起來,最後在和linkedlist中的信息join在一塊兒便可。循環
問題:可能會致使數據傾斜。遍歷
適用場景:大表join小表
思路:
將小表提早發送給maptask端的工做目錄下,而後再map程序中的setup方法中,將這個小表文件加載到一個hashmap中,接着就是map方法讀一條信息就到這個hashmap中匹配須要join的字段進行join便可。
優勢:解決上述reduce端join的問題。
注意:這個時候須要把reduce數量設置爲0
一、需求:求另兩人之間都有那些共同好友
用戶 =======================> 好友 A =======================> E,F,G,T,X,W,P B =======================> E,F,G,T,X,W,P C =======================> E,F,G,T,X,W,P D =======================> E,F,G,T,X,W,P E =======================> E,F,G,T,X,W,P F =======================> E,F,G,T,X,W,P G =======================> E,F,G,T,X,W,P H =======================> E,F,G,T,X,W,P I =======================> E,F,G,T,X,W,P
二、思路:
在reduce端,通常只是對value進行處理,也就是右邊這一塊,因此若是能夠把問題轉化爲左邊的是共同好友,右邊的是用戶,那麼就解決了。好比:
共同好友 =============> 用戶 E =============> A,B,。。。 F =============> A,B,。。。 G =============> A,B,。。。
三、須要兩個MapReduce!!!!
一、第一個MapReduce中的map須要將上述的信息轉化爲
好友 =======================> 用戶 G =======================> A E =======================> A F =======================> A G =======================> B E =======================> B F =======================> B 輸出到reduce便可
二、第一個MapReduce的reduce接受信息
思考?reduce接收到的信息中,會是怎樣的一個場景?????
E=A,E=B,F=A,F=B,E=A,E=B,F=A,F=B,G=A,G=B
是否是就將左邊相同好友的都聚在一塊兒了?
接着就是reduce遍歷共同好友對應的用戶有哪些,而且把他們都存起來最後在一併輸出到一個文件中,獲得的結果以下:
共同好友 =============> 用戶 E =============> A,B F =============> A,B G =============> A,B
三、第二個MapReduce的map端,讀取每一行數據,進行字段分割,使用(排列組合)的算法把用戶信息兩兩配對,做爲key,而後傳輸給reduce。效果以下
兩兩用戶 =============> 共同用戶 <A,B> =============> E <A,B> =============> F <A,B> =============> G
四、第二個MapReduce的reduce端接受數據
思考?reduce接收到的信息中,會是怎樣的一個場景?????
<A,B> ==> E ,<A,B> ==> F,<A,B> ==> G
將<X,Y>相同的value循環拿過來,而後拼接獲得: E,F,G。最後以<X,Y>做爲key輸出效果以下:
<A,B> ==> E,F,G