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