[特性]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中的相关字段的值自行决定导入到哪一个分区中,并自动创建相应的分区。使用上更加方便。
参考文档