hive的优化2

[color=darkblue][b][size=x-large][align=center]Hive的优化[/align][/size][/b][/color]
Hive针对不同的查询进行优化,其优化过程可以通过配置进行控制。
[b]1.列裁剪(Column Pruning)[/b]
在读取数据时,只读取查询中需要用到的列,而忽略其他的列,例如如下查询:
set hive.optimize.cp=true

[b]2.分区裁剪(Partition Pruning)[/b]
在查询过程中减少不必要的分区,例如如下查询:
select * from (select c1,count(1) from t group by c1) subq where subq.prtn =100;
select * from t1 join (select * from t2) subq on (t1.c1=t2.c2) where subq.prtn=100;

经过分区裁剪优化的查询,会在子查询中就考虑subq.prtn=100的条件,从而减少读入的分区数目。要实现分区裁剪,须设置:
set hive.optimize.pruner=true

[b]3.join操作[/b]
当使用有join操作的查询语句时,有一条原则:应该将条数少的表/子查询放在join操作符的左边。原因是在join操作的Reduce阶段,join操作符左边表中的内容会被加载到内存中,将条目少的表放在左边可以有效的减少发生内存溢出的几率。
对于一条语句中有多个join的情况,如果join的条件相同可以进行优化,比如如下查询:
insert overwrite table pv_users 
select pv.pageid, u.age from page_view p
join user u on(pv.userid=u.userid)
join newuser x on(u.userid=x.userid);

我们可以进行的优化是,如果join的key相同,那么不管有多少表,都会合并为一个MapReduce。如果join的条件不同,比如:
insert overwrite table pv_users
select pv.pageid,u.age from page_view p
join user u on (pv.userid=u.userid)
join newuser x on(u.age=x.age);

如果MapReduce的任务数目和join操作的数据是对应的,那么上述查询和一下查询是等价的:
insert overwrite table tmptable
select * from page_view p
join user u on(pv.userid=u.userid);
insert overwrite table pv_users
select x.pageid,x.age from tmptable x
join newuser y on(x.age=y.age);


[b]hive中新加字段需要注意如下:[/b]

1)如果表中有分区字段,必须先删除分区才能插入数据否则为null;

2)insert override TABLE table1 select counm1,counm2 from table2; counm1,counm2的顺序必须与table1中字段的顺序一致否则为插入的值不对;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值