十、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
相关文章
相关标签/搜索