Hive优化----编写SQL时注意事项

本文探讨了在使用Hive进行大数据处理时,如何通过调整SQL语句和优化策略来提高性能。包括数据过滤、原子化操作、合理使用中间表、控制SQL所起的JOB个数、谨慎使用mapjoin、处理数据倾斜、以及优化unionall语句等关键技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具。使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别,所以需要去掉原有关系型数据库下开发的一些固有思维。
基本原则:
1:尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段
select ... from A
join B
on A.key = B.key
where A.userid>10
     and B.userid<10
        and A.dt='20120417'
        and B.dt='20120417';
应该改写为:
select .... from (select .... from A
                  where dt='201200417'
                                    and userid>10
                         ) a
join ( select .... from B
       where dt='201200417'
                     and userid < 10   
       ) b  on a.key = b.key;
2:尽量原子化操作,尽量避免一个SQL包含复杂逻辑
可以使用中间表来完成复杂的逻辑
drop table if exists tmp_table_1;
create table if not exists tmp_table_1 as
select ......;
 
drop table if exists tmp_table_2;
create table if not exists tmp_table_2 as
select ......;
 
drop table if exists result_table;
create table if not exists result_table as
select ......;
 
drop table if exists tmp_table_1;
drop table if exists tmp_table_2; 
 
3:单个SQL所起的JOB个数尽量控制在5个以下
 
4:慎重使用mapjoin,一般行数小于2000行,大小小于1M(扩容后可以适当放大)的表才能使用,小表要注意放在join的左边(目前TCL里面很多都小表放在join的右边)。否则会引起磁盘和内存的大量消耗
 
5:写SQL要先了解数据本身的特点,如果有join ,group操作的话,要注意是否会有数据倾斜,如果出现数据倾斜,应当做如下处理:
set hive.exec.reducers.max=200;
set mapred.reduce.tasks= 200;---增大Reduce个数
set hive.groupby.mapaggr.checkinterval=100000 ;--这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.groupby.skewindata=true; --如果是group by过程出现倾斜 应该设置为true
set hive.skewjoin.key=100000; --这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.optimize.skewjoin=true;--如果是join 过程出现倾斜 应该设置为true
 
6:如果union all的部分个数大于2,或者每个union部分数据量大,应该拆成多个insert into 语句,实际测试过程中,执行时间能提升50%
insert overwite table tablename partition (dt= ....)
select ..... from (
                   select ... from A
                   union all
                   select ... from B
                   union all
                   select ... from C
                               ) R
where ...;
 
可以改写为:
insert into table tablename partition (dt= ....)
select .... from A
WHERE ...;
 
insert into table tablename partition (dt= ....)
select .... from B
WHERE ...;
 
insert into table tablename partition (dt= ....)
select .... from C
WHERE ...; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值