hive分区用2个字段有何限制_[特性]Hive动态分区功能使用
[特性]Hive動態(tài)分區(qū)功能使用
2016-01-31 21:40
說明
Hive有兩種分區(qū),一種是靜態(tài)分區(qū),也就是普通的分區(qū)。另一種是動態(tài)分區(qū)。動態(tài)分區(qū)在數(shù)據(jù)導入時,會根據(jù)具體的字段值自行決定導入,并創(chuàng)建相應的分區(qū)。使用上更為方面。
舉例
準備工作
創(chuàng)建一個表,并導入相關數(shù)據(jù),作為源數(shù)據(jù)。
1
2
3CREATE TABLE student_data(id STRING, name STRING, year INT, major INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
該表有如下數(shù)據(jù):
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 |
+------------------+--------------------+--------------------+---------------------+--+
使用靜態(tài)分區(qū)
創(chuàng)建一個表,準備用靜態(tài)分區(qū)方式將數(shù)據(jù)導入此表。
1
2
3
4CREATE TABLE student_static_partition(id STRING, name STRING)
PARTITIONED BY (year INT, major INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
使用靜態(tài)分區(qū)方式,將源表中的所有數(shù)據(jù)導入此表:
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;
導完后,查詢該表的分區(qū)信息:
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 |
+----------------------+--+
使用動態(tài)分區(qū)
然后再創(chuàng)建一個相同表結(jié)構(gòu)的表,準備以動態(tài)分區(qū)的方式導入數(shù)據(jù)。
1
2
3
4CREATE TABLE student_dynamic_partition(id STRING, name STRING)
PARTITIONED BY (year INT, major INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
使用動態(tài)分區(qū)前,需要先配置相同的Hive參數(shù),其中最重要的兩個參數(shù)是:
1
2set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
更多參數(shù)請參考下文中的參考文檔。
然后以動態(tài)分區(qū)方式導入數(shù)據(jù):
1
2
3INSERT OVERWRITE TABLE student_dynamic_partition PARTITION (year, major)
SELECT id,name,year,major
FROM student_data;
注意:在SELECT子句的各個字段應剛好與INSERT中的字段以及最后的PARTITION中的字段完全一致,包括順序。
這里,我們無需指定數(shù)據(jù)導入到哪一個分區(qū)。該語句會自動創(chuàng)建相應分區(qū),并將數(shù)據(jù)導入相應的分區(qū)。
導入完成后,查看該表的分區(qū)信息:
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 |
+----------------------+--+
兩種方式對比
通過上述實例,我們可以看到:通過動態(tài)分區(qū)方式,我們無法手工指定數(shù)據(jù)導入的具體分區(qū),而是由SELECT中的相關字段的值自行決定導入到哪一個分區(qū)中,并自動創(chuàng)建相應的分區(qū)。使用上更加方便。
參考文檔
總結(jié)
以上是生活随笔為你收集整理的hive分区用2个字段有何限制_[特性]Hive动态分区功能使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ad18原理图器件批量修改_Altium
- 下一篇: mnist手写数字数据集_mnist手写