4.5 分区表
Hive 把表组织成分区(partition).
这个是根据分区列的值对表进行粗略划分的机制.
使用分区可以加快数据切片(slice)的查询速度.
分区表要创建表的时候就要指定好分区.
每个分区对应 HDFS 文件系统中的一个文件夹. 每个分区其实就是表目录下的子目录.
比如, 查看日志文件比较大, 我们只想看某一个的日志, 普通的表需要挨个查询. 如果按照日期分区后, 则只需要在相应的分区中查询就可以了, 大大提高了查询的速度.
4.5.1 分区表基本操作
步骤1: 创建分区表
create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (year string)
row format delimited fields
terminated by '\t';
partitioned by (year string)
就表示在创建分区表. year
就表示分区列.
注意:
步骤2: 向分区表中导入数据
load data local inpath '/opt/module/datas/dept1.txt' into table dept_partition partition(year='201709');
注意: 导入数据的一定要指定导入到哪个分区.
步骤3: 查询分区表中的数据
使用 where
子句从分区表中查询数据
select * from dept_partition where year="201709";
// 可以查看有哪些分区
show partitions dept_partition;
步骤4: 增加分区
增加单个分区:
alter table dept_partition add partition(month='201706') ;
同时增加多个分区:
alter table dept_partition add partition(month='201705') partition(month='201704');
步骤5: 删除分区
删除单个分区:
alter table dept_partition drop partition (month='201704');
同时删除多个分区:
alter table dept_partition drop partition (month='201705'), partition (month='201706');
步骤6: 查看有多少分区
show partitions dept_partition;
注意:
- 如果对不是分区表使用这个命令会抛出异常.
4.5.2 分区表注意事项
创建二级分区
create table dept_partition2(
deptno int, dname string, loc string
)
partitioned by (month string, day string)
row format delimited fields terminated by '\t';
加载数据到分区
load data local inpath '/opt/module/datas/dept.txt' into table
default.dept_partition2 partition(month='201709', day='13');
查询分区数据
使用where
子句查询
select * from dept_partition2 where month='201709' and day='13'
查询二级分区数
show partitions dept_partition2 partition(month='201709')
4.5.3 分区表和数据产生关联
根据情况不同有 3 种方式:
上传数据后修复
手动创建分区目录, 后面直接通过 hdoop fs ...
的方式把数据上传到分区目录, 则需要修复一下即可.
msck repair table dept_partition2;
上传数据后添加分区
手动创建分区目录, 后面直接通过 hdoop fs ...
的方式把数据上传到分区目录, 则根据手动创建的目录, 再执行添加分区的命令就可以了.
alter table dept_partition2 add partition(month='201709',
day='11');
上传数据后load数据到分区
手动创建分区目录, 则再执行 load
命令也可以.
load data local inpath '/opt/module/datas/dept.txt' into table
dept_partition2 partition(month='201709',day='10');