[特性]Hive动态分区功能使用 2016-01-31 21:40

说明

Hive有两种分区,一种是静态分区,也就是普通的分区。另一种是动态分区。动态分区在数据导入时,会根据具体的字段值自行决定导入,并创建相应的分区。使用上更为方面。

举例

准备工作

创建一个表,并导入相关数据,作为源数据。

1
2
3
CREATE 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
4
CREATE 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
11
INSERT 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
9
SHOW PARTITIONS student_static_partition;
+----------------------+--+
|      partition       |
+----------------------+--+
| year=2001/major=810  |
| year=2001/major=820  |
| year=2002/major=810  |
| year=2002/major=820  |
+----------------------+--+

使用动态分区

然后再创建一个相同表结构的表,准备以动态分区的方式导入数据。

1
2
3
4
CREATE TABLE student_dynamic_partition(id STRING, name STRING) 
PARTITIONED BY (year INT, major INT)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',';

使用动态分区前,需要先配置相同的Hive参数,其中最重要的两个参数是:

1
2
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

更多参数请参考下文中的参考文档。

然后以动态分区方式导入数据:

1
2
3
INSERT 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
9
SHOW PARTITIONS student_dynamic_partition
+----------------------+--+
|      partition       |
+----------------------+--+
| year=2001/major=810  |
| year=2001/major=820  |
| year=2002/major=810  |
| year=2002/major=820  |
+----------------------+--+

两种方式对比

通过上述实例,我们可以看到:通过动态分区方式,我们无法手工指定数据导入的具体分区,而是由SELECT中的相关字段的值自行决定导入到哪一个分区中,并自动创建相应的分区。使用上更加方便。

参考文档

  1. Hive的动态分区
Tags: #Hive    Post on Hive