admin 发表于 2017-11-7 17:30:39

HIVE使用注意事项及技巧

HIVE使用中的一些小技巧和注意事项:
1、储存路径
关注HIVE表的数据存储,一般情况下,较少去关注HIVE的数据储存,但如果一旦涉及到定时任务或者调度系统,需要注意上游数据的产出路径、时间、是否产出成功,这时需要关注所使用数据的HDFS路径(使用desc extended table_name查询),同时,在数据正常产出后也会在HDFS路径下生成一个名为SUCCESS的空文件,作为任务产出成功的标志。

2、分区表及数据回溯
分区表:即每天产生一个分区的数据,有全量更新,也有增量更新的数据。如果是分区表,一定查询的先加分区过滤,一定要养成这个好习惯。滴滴的数据普遍采用T+1的数据,即5月3日的数据是在5月4日凌晨产生,同时有部分业务线的数据会追溯,比如5月4日凌晨不仅产生5月3日的分区数据,同时还会重新计算5月1-2日的数据,将原来5月1-2日的数据覆盖,所以不同时间产出同一时间分区的数据结果可能略有不同。

3、join优化
1)小表放join左边,左边的表放入内存。网上有说0.9版本后是自动转化的,但是需要设置参数 hive.auto.convert.join=true,默认是false。好习惯是写的时候小表放左边就好了。
2) 多表join 用同一key join,则只产生一个MR job
3)当很多指标独立,用union all 代替join

4、空值处理
1)NULL和数字相加的问题,为避免这种情况先nvl 或者 coalesce 先处理
2)NULL 值关联时,可排除掉不参与关联,也可随机分散开避免倾斜
3)尤其要关注字段本身为NULL值,还是字符串’NULL'

5、分维度汇总的小技巧
正常情况下,一般对数据会进行各个维度的汇总,比如分全国、城市、车型等等,可以使用下面的一些函数和group by配合使用,这样会减少执行次数,一次性产出分各个维度的数据。
1)with cube:简称数据魔方,可以实现hive多个任意维度的查询。
2)grouping sets:作为GROUP BY的子句,允许开发人员在GROUP BY语句后面指定多个统计选项,可以简单理解为多条group by语句通过union all把查询结果聚合起来结合起来。
3)roll up:可以实现从右到做递减多级的统计,显示统计某一层次结构的聚合。
注:mysql中可以使用with rollup使用

6、动态分区
有时候,我们生成一张分区表,可能需要回溯之前的分区数据,一种办法是通过python/shell脚本传参去执行,还有一种使用HIVE里面的动态分区,一次性回溯,前一种更容易理解,后一种效率更高。
开启动态分区功能:set hive.exec.dynamic.partition = true;
设置动态分区模式(严格模式:要求至少一分区静态;非严格模式:允许所有分区动态)
set hive.exec.dynamic.partition.mode = nonstrict;
动态分区语法:关键字partition括号内为动态分区字段,select语句最后两个字段与之对应
INSERT OVERWRITE TABLE employees
PARTITION (country, state)
select ……, se.cnty, se.st

from staged_employees se;

其他的HIVE使用技巧还有内外部表的设置,JAVAde UDF、文件流处理实现自定义函数,控制文件储存格式和压缩方式来压缩储存空间等,这些不逐一介绍,大家可以在接触之后再慢慢学习。




页: [1]
查看完整版本: HIVE使用注意事项及技巧