hive查询和优化
1:Local Model(本地模式):
select user,item from table limit 10;(生成mapreduce)
select * from table limit 10;(不会生存mapreduce)
2:列剪裁 :hive在读数据的时候,可以只读取查询中所需要用到的列
3:分区剪裁:在查询的过程中减少不必要的分区
使用explain dependency语法,获取table和partition
4:hive的优化机制减少job数:如果join的key相同,不管有多少个表,都会合并为一个mapreduce
(1) select a.val,b.val,c.val from a join b on (a.key = b.key1) join c on (c.key = b.key1) 1个mapreduce
(2) select a.val,b.val,c.val from a join b on (a.key = b.key1) join c in (c.key = b.key2) 2个
5:job输入输出优化
(1) insert overwrite table tmp1 select .. from a where 条件1
(2) insert overwrite table tem1 select .. from a where 条件2
上述合为1个
from a
insert overwrite table tmp1 select ... where 条件1
insert overwrite table tmp2 select ... where 条件2
6:避免笛卡儿积
select ... from woa_all_device_info_his A
left outer join(
select * from woa_all_info_his B
where 条件
) C
on A.app_id = C.app_id and A.imei = C.imei
7: 在join前过滤掉不需要的数据:包括分区过滤和条件过滤
8:小表放前大表放后:因为在Reduce阶段,位于join操作符左边的表的内容会被加载进内存,载入条目较少的表,可以有效减少内存溢出。当小表与大表join时,采用mapjoin,即在map端完成。可以避免数据倾斜。
select /*+mapjoin(b)*/ a.key,a.value from a join b on a.key = b.key
9: left semi join : 限制条件只能在on子句中设置过滤条件,在where子句,select子句或其他地方过滤不行
select a.key,b.key from a left semi join b on (a.key = b.key)
left semi join 与 join 的区别:b表有重复值的情况下left semi join 产生一条,join会产生多条
10:union all优化:局限于非嵌套查询
(1)
select * from (
select c1,c2,c3 from t1 group by c1,c2,c3
union all
select c1,c2,c3 from t2 group by c1,c2,c3
) t3;
(2)
select * from (
select * from t1
union all
select * from t2
) t3 group by c1,c2,c3
11: Distinct 与 Group by(去重优化):使用group by替代distinct
12:排序优化
1、order by实现全局排序,一个reduce实现,由于不能并发执行,所以效率低
2、sort by实现部分有序,单个reduce输出的结果是有序,效率高,和distribute by一起使用
3、cluster by col1 = distribute col1 sort by col1
13: 数据倾斜:任务进度只有reduce子任务未完成,因为处理的数据量和其他的reduce差异过大
http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842860.html
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐