题目1:计算用户发过多少朋友圈、获得多少点赞 用你擅长的语言计算,数据如下: T1:10w行数据 uid(用户id) log_id(日记id) uid1 log_id1 uid1 log_id2 uid2 log_id3 ... ... T2:1000w行数据,注:没有被点赞的日记不记录 log_id(日记id) like_uid(点赞的用户id) log_id1 uid2 log_id1 uid3 log_id1 uid4 log_id3 ud2 ... ... 计算 uid(用户id) 发过多少日记 获得多少点赞 uid1 2 3 uid2 1 1 ... ... ...
解法:
①统计每个用户发表日志量 select uid,count(*) as log_count from T1 group by uid ②统计每个用户的点赞量 select uid,sum(like_uid) as log_like_count group_by uid from T1 join T2 on T1.log_id =T2.log_id ③将两个表合并 select tt1.uid,tt1.log_count,tt2.log_like_count from ( select uid,count(*) as log_count from T1 group by uid )tt1 join ( select uid,count(*) as log_like_count group_by uid from T1 join T2 on T1.log_id =T2.log_id )tt2 on tt1.uid=tt2.uid
题目2:map及rudece阶段共有几次排序
1)当map函数产生输出时,会首先写入内存的环形缓冲区,当达到设定的阀值,在刷写磁盘之前,后台线程会将缓冲区的数据划分成相应的分区。在每个分区中,后台线程按键进行内排序
2)在Map任务完成之前,磁盘上存在多个已经分好区,并排好序的,大小和缓冲区一样的溢写文件,这时溢写文件将被合并成一个已分区且已排序的输出文件。由于溢写文件已经经过第一次排序,所有合并文件只需要再做一次排序即可使输出文件整体有序。
3)在reduce阶段,需要将多个Map任务的输出文件copy到ReduceTask中后合并,由于经过第二次排序,所以合并文件时只需再做一次排序即可使输出文件整体有序