十、Mapreduce的一些場景

一、排序而且求 TOPOne 和TOPN

  • 一、在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

三、reduce端的join

  • 使用場景:大表join大表it

  • 思路:table

    在map端自定義一個javabean,讀取每一行文件的時候,就在這個javabean中記錄這一行的信息以及它來自那個表,最後以id做爲key,以javabean做爲value傳輸給reduce端hashmap

    reduce端拿到一組key後,遍歷這些value,找到來自於須要join的信息,存起來,最後在和linkedlist中的信息join在一塊兒便可。循環

  • 問題:可能會致使數據傾斜。遍歷

四、map端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
相關文章
相關標籤/搜索