1、column pruning(列裁剪)
查询的时候需要哪些列,直接查这些列即可,不要全局查询。
2、partition pruning(分区裁剪)
查询的时候需要哪些分区,直接查这些分区即可,不要全局查询。
3、合理利用中间结果集
SQL1包含:select a,b,c from xxx group ...
SQL2包含:select a,b,d from xxx group ....
我们可以在sql1和sql2执行之前先创建临时表
create temporary table tmp_1 as select a,b,c,dfrom xxx group ....
然后在临时表的基础上执行SQL1和SQL2。
4、对表或分区进行分桶(大表join大表)
2张表对于连接的字段进行分桶。
处理左边表内某个桶的Mapper他知道右边表内对应的行在对应的桶内。
因此Mapper只需要获取那个桶,然后取得数据进行JOIN 。
5、多个join尽可能使用相同的连接键
select t1.a,t2.a,t3.a from t1
join t2 on t1.key1=t2.key1
join t3 on t2.key1=t3.key1;
#####连接条件相同,只有一个MR
select t1.a,t2.a,t3.a from t1
join t2 on t1.key1=t2.key1
join t3 on t2.key2=t3.key2;
#####连接条件不同,有两个MR
6、排序优化
Order By:在一个reducer上处理所有数据,虽然整体有序的,但不能并发执行,效率低。
而且只有一个reducer,作业可能跑不出来,而且很可能数据倾斜。
Sort By:排序操作在多个reducer上执行,整体无序(reducer间)但局部有序(reducer内)。
Distributed By:按指定字段分发数据到reducer,相同的hash值到同一个reducer。
我们经常使用distributed by id sort by score,来进行排序。
相同id会到同一个reducer,各个reducer中通过name来排序。