Hive任务优化(2)
JOIN优化
1.大多数情况下,Hive会对每对Join连接对象启动一个MapReduce任务。
2.多表关联时,如果每个ON子句都使用相同的连接键的话,那么只会产生一个MapReduce Job。
3.Hive总是按照从左到右的顺序执行。Hive会假定最后一张表是最大的表,在对每行记录进行连接操作时,它会将其他表进行缓存,然后扫描最后那个表进行计算。因此一般将最大表放置最后关联。也可以提供标记,显式告知最大表
/*+STREAMTABLE(s)*/
SELECT /*+STREAMTABLE(s)*/ s.ymd,s.symbol,s.price_close,d.dividend FROM stock s JOIN dividends d ON s.ymd=d.ymd AND s.symbol=d.symbol WHERE s.symbol='APPL'
4.map-side join
如果所有表中只有一张表是小表,可以在最大表通过mapper的时候将小表放入内存中。
/*+MAPJOIN(d)*/