1、何为分区表
(1)基本概念:在Hive中,分区表的意思就是相当于在该表对应的文件夹目录下创建子目录来存储不同该表分区字段对应的数据(简单一句话总结就是hive中的分区表就是分目录存储数据,将一个表的所有数据根据业务来切分成一个个小的数据集来存储)。
(2)分区表数据的查询通过where关键字来指定分区字段来进行查询,这样可以提高查询的效率。
2、分区表的基本操作
(1)创建分区表的语法
create table t_emp_partition(
emp_no int,
emp_name string
)
partitioned by (dt string) # 指定分区字段,粒度可以是按天来分区存储数据或者按月来存储
row format delimited fields terminated by '\t';
(2)通过load命令加载数据到分区表中
load data [local] inpath '数据所在的目录,可以是本地系统或者HDFS文件系统上的目录' into table 库名.表名 partition (dt = '2019-09-16')
#备注:[local]是可选的,如果是本地系统,则需要加上local关键字,如果是HDFS文件系统上的数据则不用。
(3)查询分区表的数据
select * from t_emp_partition where dt = '2019-09-16';
(4)查询分区表中多个分区的数据
select * from t_emp_partition where dt = '2019-09-16' or dt = '2019-09-15';
或者使用union all来联合查询
select * from temp_partition where dt = '2019-09-16'
unoin all
select * from t_emp_partition where dt = '2019-09-15';
(5)增加单个分区或者多个分区
#增加单个分区
alter table t_emp_partition add partition(dt='2019-09-17');
#增加多个分区
alter table t_emp_partition add partition(dt='2019-09-17') partition(dt='2019-09-18');
(6)删除分区或者删除多个分区
# 删除单个分区
alter table t_emp_partition drop partition(dt='2019-09-17');
# 删除多个分区
alter table t_emp_partition drop partition(dt='2019-09-17') partition(dt='2019-09-18');
(7)查看某个表有多少个分区
show partitions t_emp_partition;
(8)查看分区表的结构
desc formatted t_emp_partition;
3、二级分区表
(1)创建二级分区表
create table if not exists t_emp_two_partition(
emp_no int,
emp_name string
)
partitioned by(month string,day string)
row format delimited fields terminated by '\t';
(2)加载数据到二级分区表中
load data [local] inpath '数据所在的目录' into table 库名.表名 partition(month='2019-09',day='16');
(3)查询二级分区表中的分区数据
select * from t_emp_two_partition where month = '2019-09' and day = '16';
4、数据与分区表关联的3种方式
1)第一种方式
(1)先在某张分区表的目录下面创建分区目录,然后再将数据上传到该分区目录下
# 该命令是在hive的命令行客户端执行的
dfs -mkdir -p /user/hive/warehouse/t_two_emp_partition/month=2019-09/day=17;
# 在通过hdfs的put命令将数据上传到该分区目录下
dfs -put '数据所在的目录' /user/hive/warehouse/t_two_emp_partition/month=2019-09/day=17;
(2)此时会发现通过select + where查询分区字段的数据出现查询不到的现象
select * from t_emp_two_partition where month = '2019-09' and day = '17';
(3)通过执行修复命令msck repair table 表名来修复数据
msck table t_emp_two_partition;
(4)此时再次查询就可以查询到刚刚上传到分区目录下的数据了
select * from t_emp_two_partition where month = '2019-09' and day = '17';
2)第二种方式:先上传数据再添加指定的分区
(1)先在某张分区表的目录下面创建分区目录,然后再将数据上传到该分区目录下
# 该命令是在hive的命令行客户端执行的
dfs -mkdir -p /user/hive/warehouse/t_two_emp_partition/month=2019-09/day=18;
# 在通过hdfs的put命令将数据上传到该分区目录下
dfs -put '数据所在的目录' /user/hive/warehouse/t_two_emp_partition/month=2019-09/day=18;
(2)通过命令alter table 表名 add partition(分区字段=分区值)来添加分区
alter table t_emp_two_partition add partiton(month='2019-09',day='18');
(3)此时查询分区数据就可以查询的到了
select * from t_emp_two_partition where month = '2019-09' and day = '18';
3)第三种方式:先创建分区目录再通过load命令将数据加载到分区表指定的分区中
(1)在HDFS文件系统中该分区表的目录下创建分区目录
dfs -mkdir -p /user/hive/warehouse/t_emp_two_partition/month=2019-09/day=19;
(2)通过load命令加载数据到分区表的指定分区中
load data [local] inpath '数据所在的目录' into table 库名.表名 partition(分区字段='分区值');
(3)查询分区表的指定分区下数据
select * from t_emp_two_partition where month='2019-09' and day = '19';