Hive分区就是在HDFS上创建独立的文件夹,该文件夹下是该分区的所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择来查询所需要的指定分区,这样的查询效率会提高很多。
1、引入分区表
最终呈现的效果就是在HDFS上按照分区的目录存储文件:
/user/hive/warehose/log/201801/01/dept.log
/user/hive/warehose/log/201801/02/dept.log
/user/hive/warehose/log/201801/03/dept.log
2、创建分区表
创建分区的关键语句是partitioned by (分区名 类型):
create table dept_partition(
deptno int,dname string,loc string
)
partitioned by (month string)
row format delimited fields terminated by '\t';
3、加载数据到分区表中
load data local inpath '/opt/module/datas/dept.txt' into table dept_partition partition(month='201801');
4、查询分区表中的数据
单分区查询:
select * from dept_partition where month='201801';
多分区联合查询:
select * from dept_partition where month='201801'
union
select * from dept_partition where month='201802'
union
select * from dept_partition where month='201803';
5、增加分区
创建单个分区:
alter table dept_partition add partition(month='201802');
同时创建多个分区:
alter table dept_partition add partition('201803') partition(month='201804');
6、查看分区
show partitions dept_partition;
7、删除分区
删除单个分区:alter table dept_partition drop partition(month='201801');
同时删除多个分区:alter table dept_partition drop partition(month='201802'),partition(month='201803');
8、查看分区表的结构
desc formatted dept_partition;
9、创建二级分区表
create table dept_partition2(
deptno int,dname string,loc string
)
partitioned by (month string,day string)
row format delimited fields terminated by '\t';
10、向二级分区表中导入数据
load data local inpath '/opt/module/datas/dept.txt' into table dept_partition2 partition(month='201809',day='21');
11、查询二级分区表的数据
select * from dept_partition2 where month='201801' and day='21';
Hive 分区数据关联的三种方式
1、上传完分区数据后修复
在hive命令行中直接将文件上传到HDFS上
//HDFS上创建目录
hive(default)> dfs -mkdir -p /user/hive/warehose/dept_partition2/month=201801/day=01;
//HDFS上直接上传文件
hive(default)> dfs -put /opt/module/datas/dept.txt /user/hive/warehose/dept_partition2/month=201801/day=01;
//修复数据关联(如果不修复就没有查询结果)
hive(default)> msck repair dept_partition2;
2、上传完数据后添加分区
//创建目录
hive(default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201804/day=02;
//上传数据到HDFS上
hive(default)> dfs -put /opt/module/datas/dept.txt /user/hive/warehouse/dept_partition2/month=201804/day=02;
//增加分区
hive(default)> alter table dept_partition2 add partition(month='201804',day='02');
3、上传数据后load数据到分区
//创建目录
hive(default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201804/day=03;
//load数据到分区
hive(default)> load data local inpath '/opt/module/datas/dept.txt' into table dept_partition2 partition(month='201804',day='03');