大体理解为: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阶段都作了什么
3. dictinct生成的任务map阶段和reduce阶段都作了什么
子查询生成几个job
4. left semi join生成几个job map 阶段和reduce阶段都作什么事儿
5. 数据倾斜是怎么回事,写sql的时候要注意哪些防止数据倾斜
6. 常见的排序有哪些,各有什么优缺点,map阶段和reduce阶段都作了什么
表Course_z:8条记录
表SC_z:13条记录
表Student_z:8条记录
1. Leftjoin
N个表join生成n-1个job,读入几条记录就有几个mapper,在map端执行完后到1个reducer上执行;
内部join的结果看作1条记录因此有1+8个mapper
当使用外关联时,若是将副表的过滤条件写在Where后面,那么就会先全表关联,以后再过滤,时间消耗更多
2. Groupby
Map阶段,group by的参数做key,有combiner的过程
Reduce阶段key去重并reduce
3. Distinct
Map阶段,distinct字段做key,没有combiner的过程
reduce阶段去重
group by比distinct效率高
4. Leftsemi join(效果至关于In,执行的时候按Join处理)
至关于
1个join对应1个job
Map阶段,表加tag,
Reduce阶段按tag操做,只保留左表字段
5. 数据倾斜
表现:某个或少数几个reducer长时间处于未完成状态,任务进度长时间维持在99%(或100%),处理时间远大于平均时长;数据倾斜的Job中reducer个数>1
缘由: 1. 小表join大表
优化:咱们要看有哪些过程是须要至少两个reducer来执行的,而后去优化那些运算;增长reduce 的jvm内存(不采用);增长reduce 个数(不采用);distinct;customer partition;pipeline;index 尤为是bitmap index;mapjoin;
6. Order by,只在reduce端执行,且1个orderby对应1个reducer
优势:整体有序
缺点:只用1个reducer,数据越大运行越慢
Sort by,在各mapper端排序,reduce端不排序,因此整体是无序的
优势:运行较快
缺点:总体无序
Distribute by,reduce端执行
Cluster by, clusterby的功能就是distribute by和sort by相结合