[特性]Hive動態分區功能使用
2016-01-31 21:40
說明
Hive有兩種分區,一種是靜態分區,也就是普通的分區。另一種是動態分區。動態分區在數據導入時,會根據具體的字段值自行決定導入,并創建相應的分區。使用上更為方面。
舉例
準備工作
創建一個表,并導入相關數據,作為源數據。
1
2
3CREATE TABLE student_data(id STRING, name STRING, year INT, major INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
該表有如下數據:
SELECT * FROM student_data;
+------------------+--------------------+--------------------+---------------------+--+
| student_data.id | student_data.name | student_data.year | student_data.major |
+------------------+--------------------+--------------------+---------------------+--+
| 2001810081 | cheyo | 2001 | 810 |
| 2001810082 | pku | 2001 | 810 |
| 2001810083 | rocky | 2001 | 810 |
| 2001810084 | stephen | 2001 | 810 |
| 2001810086 | rongqi | 2001 | 810 |
| 2001810087 | hauaa | 2001 | 810 |
| 2001810088 | file | 2001 | 810 |
| 2001810089 | note | 2001 | 810 |
| 2001820081 | hello | 2001 | 820 |
| 2001820082 | jaccy | 2001 | 820 |
| 2001820083 | micky | 2001 | 820 |
| 2001820084 | lucy | 2001 | 820 |
| 2002810081 | cindy | 2002 | 810 |
| 2002810082 | lemon | 2002 | 810 |
| 2002820081 | jacky | 2002 | 820 |
| 2002820082 | cindy | 2002 | 820 |
| 2002820083 | happy | 2002 | 820 |
| 2002820084 | snow | 2002 | 820 |
+------------------+--------------------+--------------------+---------------------+--+
使用靜態分區
創建一個表,準備用靜態分區方式將數據導入此表。
1
2
3
4CREATE TABLE student_static_partition(id STRING, name STRING)
PARTITIONED BY (year INT, major INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
使用靜態分區方式,將源表中的所有數據導入此表:
1
2
3
4
5
6
7
8
9
10
11INSERT INTO TABLE student_static_partition PARTITION(year=2001,major=810)
SELECT id,name FROM student_data WHERE year=2001 AND major=810;
INSERT INTO TABLE student_static_partition PARTITION(year=2001,major=820)
SELECT id,name FROM student_data WHERE year=2001 AND major=820;
INSERT INTO TABLE student_static_partition PARTITION(year=2002,major=810)
SELECT id,name FROM student_data WHERE year=2002 AND major=810;
INSERT INTO TABLE student_static_partition PARTITION(year=2002,major=820)
SELECT id,name FROM student_data WHERE year=2002 AND major=820;
導完后,查詢該表的分區信息:
1
2
3
4
5
6
7
8
9SHOW PARTITIONS student_static_partition;
+----------------------+--+
| partition |
+----------------------+--+
| year=2001/major=810 |
| year=2001/major=820 |
| year=2002/major=810 |
| year=2002/major=820 |
+----------------------+--+
使用動態分區
然后再創建一個相同表結構的表,準備以動態分區的方式導入數據。
1
2
3
4CREATE TABLE student_dynamic_partition(id STRING, name STRING)
PARTITIONED BY (year INT, major INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
使用動態分區前,需要先配置相同的Hive參數,其中最重要的兩個參數是:
1
2set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
更多參數請參考下文中的參考文檔。
然后以動態分區方式導入數據:
1
2
3INSERT OVERWRITE TABLE student_dynamic_partition PARTITION (year, major)
SELECT id,name,year,major
FROM student_data;
注意:在SELECT子句的各個字段應剛好與INSERT中的字段以及最后的PARTITION中的字段完全一致,包括順序。
這里,我們無需指定數據導入到哪一個分區。該語句會自動創建相應分區,并將數據導入相應的分區。
導入完成后,查看該表的分區信息:
1
2
3
4
5
6
7
8
9SHOW PARTITIONS student_dynamic_partition
+----------------------+--+
| partition |
+----------------------+--+
| year=2001/major=810 |
| year=2001/major=820 |
| year=2002/major=810 |
| year=2002/major=820 |
+----------------------+--+
兩種方式對比
通過上述實例,我們可以看到:通過動態分區方式,我們無法手工指定數據導入的具體分區,而是由SELECT中的相關字段的值自行決定導入到哪一個分區中,并自動創建相應的分區。使用上更加方便。
參考文檔