分區作爲一種提高數據操作靈活性的手段,被廣泛應用於關係型數據庫中。在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可以批量創建分區和數據文件的映射;