【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可以批量創建分區和數據文件的映射;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章