大体理解为:hive会对写好的sql语句进行拆解,按执行顺序拆分红树结构(AST)交给mapreduce处理;html
hive对不一样DML/DDL关键字有不一样的反应,比较敏感的有select、from、join、group by、distinct、insert等;sql
对查询语句,hive首先会先根据from找到数据源(metastore),而后从查询内部开始找用到的字段及其类型,看语句要求对字段直接处理(加减乘除等)仍是聚合处理(sum等),并检查语句是否正确——扫描表、语法分析、语义分析;app
找出须要的字段,剩下的就是对字段下的取值进行的操做了jvm
join的过程,由于涉及两个及以上的表,在map阶段会对不一样表打上不一样标签来区分,打上标签之后其实就能够按一个表来理解;优化
group by与distinct的过程,相似map端的combiner与reduce端的功能,就是按不一样Key展现结果且key不重复;spa
order by的过程,只在reduce端执行,也就是只须要一个reducer,耗时耗内存,能够用 (distribute by col sort by col) order by这样的结构代替;htm
mapjoin用于大小表相连,提升效率;blog
hive用left semi join代替in排序
1. left join 的条件,条件不一样生成的job数量有什么不一样,多个表join生成的job数量有什么不一样.ip
2. group by 生成的任务map阶段和reduce阶段都作了什么
<