Hive有分区表和分桶表这两个概念。
分区表 基本操作Hive的分区是指将存储的数据进一步细分,相当于一个表的分目录。一个表内有多个分区表。
create table table_name (column_name column_type, ...) partitioned by (partition_column partition_type) //例如 按天进行分区 create table dept_partition(deptno int, dname string, loc string) partitioned by (day string) row format delimited fields terminated by 't';
注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
load data时指定分区load data inpath "/data/test.txt" into table dept_partition partition(day='20211110');
我们再加载数据之后可以看到,在该表下还有一个文件夹,文件夹的名称和分区名称对应,分区文件夹下是具体的数据文件。
select * from dept_partition where day='20211110';
当我们的限制条件用的是分区的时候,hive只会在该分区的文件夹下的数据查询,不会到其他分区去查询目标。
多分区联合查询多分区联合查询使用union或者or来实现。
//union select * from dept_partition where day='20211110' union select * from dept_partition where day='20211109' //or select * from dept_partition where day='20211110' or day='20211109'增加分区
创建分区使用alter add增加。
//创建单个分区 alter table dept_partition add partition(day='20200404'); //创建多个分区 alter table dept_partition add partition(day='20200405') partition(day='20200406');
注意多个分区之间是用空格隔开。
删除分区删除分区用alter drop删除。
//删除单个分区 alter table dept_partition drop partition (day='20200406'); //删除多个分区 alter table dept_partition drop partition(day='20200404'), partition(day='20200405');
注意多个分区之间是用逗号隔开。
查看分区show partitions dept_partition;二级分区
二级分区就是对一级分区内再做一次分区。
create table dept_partition2( deptno int, dname string, loc string ) partitioned by (day string, hour string) row format delimited fields terminated by 't';动态分区
上述的分区都是直接输入分区值,这属于静态分区。Hive可以根据数据里的具体列进行分区,到哪个分区取决于该列的数据,这样就可以实现动态分区。
使用动态分区需要设置为非严格模式(严格模式只能开静态分区)。
hive.exec.dynamic.partition.mode=nonstrict
动态分区使用insert实现。下面的代码就是通过了数据中的loc实现分区,这就是动态分区。
insert into table dept_partition_dy partition(loc) select deptno, dname, loc from dept;
在hive3.0的版本中,会将select的最后一个字段当作分区字段,同时不需要设置为非严格模式。



