hive实战---动态分区

来源:互联网 发布:编程游戏软件 编辑:程序博客网 时间:2024/05/22 10:30

动态分区的含义:

当一个分区表创建之后,其分区的值是可以动态修改的(先创建分区值,再插入数据;或者是在插入数据的时候指定一个新的分区值),这两种方式都是需要手动的去指定分区值。

 

当分区变的非常多的时候(比如气象站的气温记录数据,根据年份分区之后,还有根据月份分区,下面可能还有根据日期分区),当要上传数据到这样的表中的时候,手动去指定分区显然是不现实的

这个时候,就需要使用到动态分区,动态分区可以在往表中插入数据的时候,动态的根据值来选择数据进入的分区。

 

动态分区使用场景

假设在HDFS上已经存在一个宽表(例如,职员表,这个表的字段非常多,并且数据量也很大),我们想要根据国家和省份把这些数据放到不同的分区中,使用动态分区是十分合适的。

1.首先创建一个分区表,指定两级分区,国家和省份

create table emp(name string,age int) partitioned by (country string,state string) row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;

2.从宽表中查询出所需要的字段加载到分区表中

insert into table emp partition(country,state) select name,age,country,state from t1;

这里就是动态分区的关键:

在指定分区的时候,不指定其值,而只是指定分区的名称,在后面的查询语句中,所查询的最后两个字段就会被对应到这两个分区上,也就是说,前面分区不指定值的话,就会到后面的查询语句中去动态的寻找值,这时可以想象,后面的查询语句的字段必须是大于等于前面的分区数;

 

如果动态分区创建失败,可能是检查项被设置为严格模式,严格模式下,不允许所有的分区都被动态指定,目的是为了防止生成太多的目录,此时可以通过将检查选项设置为非严格模式就可以了。

 

 

3.HDFS上去查看生成的动态分区结构

/user/hive/warehouse/base1.db/emp/user/hive/warehouse/base1.db/emp/country=hebei/user/hive/warehouse/base1.db/emp/country=hebei/state=tangshang/user/hive/warehouse/base1.db/emp/country=hebei/state=tangshang/000000_0/user/hive/warehouse/base1.db/emp/country=wang/user/hive/warehouse/base1.db/emp/country=wang/state=wang/user/hive/warehouse/base1.db/emp/country=wang/state=wang/000000_0

源表中只有两条数据,所以只生成了两个country分区,相同的country分区下也只有一个数据,可以往源表中放入不同的数据用来测试。

 

 

4.半动态分区

所谓半动态分区就是并不是所有的分区值都是动态指定的,其中有一部分是固定值,另一部分需要在查询列中动态赋值,例如:

insert into table emp partition(country = 'US',state) select name,age,country,state from t1;

上述语句中,分区country就是一个固定的值USstate的值没有指定,而是动态赋值,半分区模式需要注意的是,动态分区必须放在最后。