分区作为一种提高数据操作灵活性的手段,被广泛应用于关系型数据库中。在Hive中我们同样可以采用分区的方式来提高数据操作效率,不同于关系型数据库(如Oracle),Hive的分区表既可以是内部表,也可以是外部表。
本篇文章主要介绍如何在Hive中创建分区表、分区表上的DDL操作,以及使用分区表的注意事项。
1. 创建分区表
1.1 创建内部分区表
create table myhive.test_internal(id int) partitioned by (date string)
row format delimited fields terminated by ' ';
1.2 创建外部分区表
create external table myhive.test_external(id int) partitioned by (date string)
row format delimited fields terminated by ' ';
2. 添加分区
内部分区表和外部分区表都可以使用如下2种方式添加分区:
(1)ALTER TABLE … ADD PARTITION …
(2)MSCK REPAIR TABLE …
2.1 内部分区表添加分区
#创建分区目录
hdfs dfs -mkdir -p /user/hive/warehouse/myhive.db/test_internal/date=2020-01-01
hdfs dfs -mkdir -p /user/hive/warehouse/myhive.db/test_internal/date=2020-01-15
hdfs dfs -mkdir -p /user/hive/warehouse/myhive.db/test_internal/date=2020-01-20
#上传分区对应文件
hdfs dfs -put 2020-01-01.txt /user/hive/warehouse/myhive.db/test_internal/date=2020-01-01/
hdfs dfs -put 2020-01-15.txt /user/hive/warehouse/myhive.db/test_internal/date=2020-01-15/
hdfs dfs -put 2020-01-20.txt /user/hive/warehouse/myhive.db/test_internal/date=2020-01-20/
#查看分区为空
hive (myhive)> show partitions test_internal;
OK
partition
Time taken: 0.096 seconds
#ADD PARTITION方式添加分区
hive (myhive)> alter table test_internal add partition (date='2020-01-01');
OK
Time taken: 0.14 seconds
#查看添加后结果,有一个分区(date='2020-01-01')
hive (myhive)> show partitions test_internal;
OK
partition
date=2020-01-01
Time taken: 0.097 seconds, Fetched: 1 row(s)
#查询添加分区后的表数据
hive (myhive)> select * from test_internal;
OK
test_internal.id test_internal.date
1 2020-01-01
Time taken: 0.104 seconds, Fetched: 1 row(s)
#MSCK REPAIR方式添加分区
hive (myhive)> msck repair table test_internal;
OK
Partitions not in metastore: test_internal:date=2020-01-15 test_internal:date=2020-01-20
Repair: Added partition to metastore test_internal:date=2020-01-15
Repair: Added partition to metastore test_internal:date=2020-01-20
Time taken: 0.241 seconds, Fetched: 3 row(s)
#查看添加后结果,分区全部添加进来了
hive (myhive)> show partitions test_internal;
OK
partition
date=2020-01-01
date=2020-01-15
date=2020-01-20
Time taken: 0.091 seconds, Fetched: 3 row(s)
#查询添加分区后的表数据
hive (myhive)> select * from test_internal;
OK
test_internal.id test_internal.date
1 2020-01-01
2 2020-01-15
3 2020-01-20
Time taken: 0.104 seconds, Fetched: 3 row(s)
2.2 外部分区表添加分区
#创建目录
hdfs dfs -mkdir -p /user/hive/warehouse/myhive.db/test_external/date=2020-01-01
hdfs dfs -mkdir -p /user/hive/warehouse/myhive.db/test_external/date=2020-01-15
hdfs dfs -mkdir -p /user/hive/warehouse/myhive.db/test_external/date=2020-01-20
#上传文件
hdfs dfs -put 2020-01-01.txt /user/hive/warehouse/myhive.db/test_external/date=2020-01-01/
hdfs dfs -put 2020-01-15.txt /user/hive/warehouse/myhive.db/test_external/date=2020-01-15/
hdfs dfs -put 2020-01-20.txt /user/hive/warehouse/myhive.db/test_external/date=2020-01-20/
#查看分区为空
hive (myhive)> show partitions test_external;
OK
partition
Time taken: 0.093 seconds
#ADD PARTITION方式添加分区
hive (myhive)> alter table test_external add partition (date='2020-01-01');
OK
Time taken: 0.14 seconds
#查看添加后结果,有一个分区(date='2020-01-01')
hive (myhive)> show partitions test_external;
OK
partition
date=2020-01-01
Time taken: 0.082 seconds, Fetched: 1 row(s)
#查询添加分区后的表数据
hive (myhive)> select * from test_external;
OK
test_external.id test_external.date
1 2020-01-01
Time taken: 0.108 seconds, Fetched: 1 row(s)
#MSCK REPAIR方式添加分区
hive (myhive)> msck repair table test_external;
OK
Partitions not in metastore: test_external:date=2020-01-15 test_external:date=2020-01-20
Repair: Added partition to metastore test_external:date=2020-01-15
Repair: Added partition to metastore test_external:date=2020-01-20
Time taken: 0.198 seconds, Fetched: 3 row(s)
#查看添加后结果,分区全部添加进来了
hive (myhive)> show partitions test_external;
OK
partition
date=2020-01-01
date=2020-01-15
date=2020-01-20
Time taken: 0.081 seconds, Fetched: 3 row(s)
#查询添加分区后的表数据
hive (myhive)> select * from test_external;
OK
test_external.id test_external.date
1 2020-01-01
2 2020-01-15
3 2020-01-20
Time taken: 0.098 seconds, Fetched: 3 row(s)
3. 重命名分区
内部分区表和外部分区表都使用RENAME TO PARTITION
命令重命名分区,以内部分区表为例:
alter table myhive.test_internal partition (date='2020-01-15') rename to partition (date='2020-01-16');
4. 删除分区
内部分区表和外部分区表都使用DROP PARTITION
命令删除分区,以内部分区表为例:
alter table myhive.test_internal drop partition (date='2020-01-01');
5. 分区表的注意事项
(1)应选择低基数列作为分区键;
(2)尽量避免分区过小,建议大于1G;
总结
Hive中的一个分区就是一个目录,分区键值就是目录名称,分区键是表中的一个虚拟列;
当数据量过大时可采用分区表提高查询效率;
需谨慎选择分区键,尽量选用低基数列;
ADD PARTITION需要指定分区键值,MSCK REPAIR可以批量创建分区和数据文件的映射;