①join连接时的优化:当三个或更多的表进行join连接时,如果每个on使用相同的字段连接时只会产生一个MapReduce job。
②join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。 原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算。

tips: 用户并非总是要将最大的表放置在查询语句最后面,因为Hive提供了一个“标记”机制来显式地告知查询优化器哪张表是大表。
/*+STREAMTABLE(tablename)*/

③在where字句中增加分区过滤器。

④当可以使用

left semi join

语法时不要使用

inner join

前者效率更高。

原因:对于左表中指定的一条记录,一旦在右表中找到匹配的记录,Hive立即停止扫描。

tips: LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

⑤如果所有表中有一张表足够小,则可置于内存中,Hive可以在map端执行连接过程(map-side JOIN),这是因为Hive可以和内存中的小表进行逐一匹配,从而省略掉常规连接操作所需要的reduce过程。 设置属性即可实现:

set hive.auto.covert.join=true;

用户可以配置希望被优化的小表的大小

set hive.mapjoin.smalltable.size=2500000;

如果需要使用这两个配置可置入$HOME/.hiverc文件中。
Hive对于右外连接和全外连接不支持这个优化。

⑥同一种数据的多种处理:从一个数据源产生的多个数据聚合,无需每次聚合都需要重新扫描一次。 例如:

insert overwrite table student select from employee; insert overwrite table person select from employee;

可以优化成:

from employee insert overwrite table student select insert overwrite table person select

⑦limit调优:limit语句通常是执行整个语句后返回部分结果。

set hive.limit.optimize.enable=true;

⑧开启并发执行。 某个job任务中可能包含众多的阶段,其中某些阶段没有依赖关系可以并发执行,开启并发执行后job任务可以更快的完成。设置属性:

set hive.exec.parallel=true;

⑨hive提供的严格模式,禁止3种情况下的查询。

a:当表为分区表时,where子句后没有分区字段和限制时,不允许执行。

b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。

c:限制笛卡尔积的查询。

⑩合理的设置map和reduce数量。

11:JVM重用。可在hadoop的mapred-site.xml中设置JVM被重用的次数。

12:使用explain和explain extended学习Hive是如何将查询转化为MapReduce任务的。

参考资料:https://blog.link-lin.cn/