【Hive】Hive分区表

分区作为一种提高数据操作灵活性的手段,被广泛应用于关系型数据库中。在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可以批量创建分区和数据文件的映射;

    原文作者:NextAction
    原文地址: https://blog.csdn.net/NextAction/article/details/106770667
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞