hiveSQL的执行顺序以及hive优化

前段时间在面试橙鹰数据的时候被问了一道SQL执行顺序的题目,之前虽然写过很多sql,但是没有从一个更高的视角来看自己写的代码,更不要提该如何优化了。随着数据量的增大,掌握sql的执行原理并进行优化是一项非常必要的技能。这篇文章会对一个sql语句的执行顺序进行总结,并进一步推导出可以优化的点。

因为工作时以hivesql为主,所以本文以hivesql进行讲解。
hive是基于Hadoop的Map Reduce
总体顺序:
from ..on .. join .. .. where .. select .. group by .. having .. order by


在map阶段

  1. from 加载,进行表的查找和加载
  2. where过滤
  3. select查询
  4. group by 执行分组后的相关计算
  5. map端文件合并
    在Reduce阶段
    1.group by :对map端发来的文件进行合并
  6. select : 过滤列用于输出结果
  7. limit排序

知道了hive的执行顺序后,我们来看几条可以提升hive速度的方式。

原则一:分区一定要加。

原则二:连接表时使用相同的关键词,这样只会产生一个job。

原则三:减少每个阶段的数据量,只选出需要的,在join表前就进行过滤。在实习时,有时候为了减少代码量,包含了多余的字段,导致速度会变慢一些。

原则四:map端聚合。在上data mining的时候,写map reduce程序,有时候会在mapper和reducer之间加一个combinator,提前进行合并以减少通信成本。

hive.map.aggr=true; // 用于设定是否在 map 端进行聚合,默认值为真hive.groupby.mapaggr.checkinterval=100000; // 用于设定 map 端进行聚合操作的条目数

原则五:大表放后面。在执行多个表时,会先将前面的表放到缓存,因此最好将大表放到最后。

以上是我在实习时候使用的一些技巧,还有很多hive设置的技巧可以参考一下链接,等我亲自实践后再更新到上面。

http://daizj.iteye.com/blog/2289981

你可能感兴趣的:(hiveSQL的执行顺序以及hive优化)