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

本文探讨了在使用Hive进行大数据处理时,如何通过调整SQL语句和优化策略来提高性能。包括数据过滤、原子化操作、合理使用中间表、控制SQL所起的JOB个数、谨慎使用mapjoin、处理数据倾斜、以及优化unionall语句等关键技巧。
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 ...; 
使用 `hive -f` 命令执行脚本文件,有几个关键注意事项需要特别关注: 1. **脚本文件的路径问题**:确保提供的脚本文件路径是正确的,并且Hive有权限访问该路径。如果脚本文件位于远程服务器上,则需要确保网络连接正常并且Hive配置支持从该位置读取文件。 2. **环境变量和配置设置**:在脚本中使用的任何环境变量都需要提前定义好,或者在脚本内部进行定义。此外,对于特定的Hive配置参数,可以在脚本开始处通过 `SET` 命令进行设置,以保证这些设置对整个查询有效[^3]。 3. **SQL语法兼容性**:编写HiveQL脚本,要确保所使用的语法与当前运行的Hive版本兼容。不同版本之间可能存在差异,这可能会影响脚本的行为或性能。 4. **错误处理**:当执行包含多个语句的脚本,考虑加入适当的错误处理机制。例如,在shell脚本中可以利用条件判断来检查每条命令是否成功执行,从而决定后续步骤如何继续。 5. **资源管理**:考虑到大数据处理可能会消耗大量系统资源,合理规划任务的并发度以及适当调整MapReduce的相关参数(如`mapreduce.job.reduces`)是非常重要的,这样可以帮助优化作业执行效率并避免过度占用集群资源[^4]。 6. **日志记录和调试信息**:为了便于故障排查和性能调优,建议在脚本中添加足够的日志输出。可以通过`echo`或其他方式将重要信息打印出来,帮助理解脚本执行过程中的状态变化。 7. **安全性和权限控制**:确认执行用户拥有足够的权限去访问涉及的所有数据库对象,包括但不限于表、分区等。同也要注意保护敏感数据不被未经授权地访问。 8. **结果输出管理**:若希望保存查询结果,需明确指定输出格式及目的地。比如使用`INSERT OVERWRITE [LOCAL] DIRECTORY`来导出数据到指定目录,并注意目标位置的数据是否会因重复执行而被覆盖。 9. **转义字符处理**:当脚本内含有特殊字符,务必正确地进行转义处理,防止出现解析错误。特别是在动态生成SQL字符串的情况下更需小心对待此类问题[^1]。 ```bash # 示例:一个简单的HiveQL脚本调用示例 yesterday=$(date -d "now -1 day" +%Y-%m-%d) hive -f myscript.hql --hivevar yesterday=${yesterday} ``` 其中,在`myscript.hql`中你可以引用传递进来的变量`${yesterday}`来进行日期相关的操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值