1.四大by
- order by(全局排序)
只有一个reduce。这里无论设置多少个reduce数,都是一个
优点:全局排序
缺点:当数据量大的时候,耗时长,效率低,适用于较小数据量的场景(十万、百万) - sort by(分区内排序)
对每一个reduce内部的数据进行排序,全局结果来说不是排序的
也就是说只能保证每一个reduce输出的文件中的数据是按照规定字段排序的
适用于数据量大,但是对排序要求不严格的场景,可以大幅提高执行效率(抽样)
需要预先设置reduce个数,reduce结果文件内部有序,全局是无序的
set mapreduce.job.reduces = 10; select * from emp sort by sal desc;
3.distribute by(分区排序)
控制特定的key到指定的reducer,方便后续的聚合操作,类似于MR中自定义分区,一般结合sort by使用
需要预先设置reduce个数,否则不会启动相应的reducer进行任务的执行,导致最后不能完全分区。
set mapreduce.job.reduces = 10; select * from emp distribute by deptno sort by sal desc;
注意
- distribute by要在sort by之前
- distribute by的分区规则是根据分区字段的hash码与reduce的个数进行取模后,余数相同的分到一个分区
- order by
- sort by
- distribute by
- cluster by
当distribute by和sort by字段相同的时候,可以写成cluster by
但是这个排序,只能升序
select * from emp cluster by deptno; select * from emp distribute by deptno sort by deptno;
面试题
Q:订单表,取gmv(Gross Merchandise Volume,即商品交易总额,是成交总额(一定时间段内)的意思)top100的用户(比如有一亿的用户)
--全局排序显然不行,耗时长,效率低 select user_id from dwd_order_df order by gmv desc limit 100; --多个reduce,分区内排序,最后再全局排序 set mapreduce.job.reduces = 100; select * from ( select user_id,gmv from dwd_order_df distribute by city sort by gmv desc limit 100 ) a order by gmv limit 100;
2.三大join
- common/shuffle/reduce join
最普通的join,产生shuffle,且这个会在reduce段join - mapjoin