數據庫分區的主要目的是為了在特定的SQL操作中減少數據讀寫的總量以縮減響應時間,主要包括兩種分區形式:水平分區與垂直分區。水平分區是對表進行行分區。而垂直分區是對列進行分區,一般是通過對表的垂直划分來減少目標表的寬度,常用的是水平分區.
1. hive建立分區表
create external table if not exists tablename( a string, b string) partitioned by (year string,month string) row format delimited fields terminated by ',';
2. hive對包含分區字段的表進行數據插入
2.1. 靜態插入數據
要求插入數據時指定與建表時相同的分區字段
INSERT OVERWRITE tablename (year='2017', month='03') SELECT a, b FROM tablename2;
2.2 動靜混合分區插入
要求指定部分分區字段的值
INSERT OVERWRITE tablename (year='2017', month) SELECT a, b FROM tablename2;
2.3. 動態分區插入
只指定分區字段,不用指定值
INSERT OVERWRITE tablename (year, month) SELECT a, b FROM tablename2;
3. hive動態分區相關參數設置
使用動態分區表必須配置的參數:
set hive.exec.dynamic.partition =true; --(默認false),表示開啟動態分區功能 set hive.exec.dynamic.partition.mode = nonstrict; --(默認strict),表示允許所有分區都是動態的,有 strict和 nonstrict 兩個值可選,strict 要求至少包含一個靜態分區列,nonstrict則無此要求
動態分區相關的調優參數:
set hive.exec.max.dynamic.partitions.pernode=100 --(默認100,一般可以設置大一點,比如1000).表示每個maper或reducer可以允許創建的最大動態分區個數,默認是100,超出則會報錯。 set hive.exec.max.dynamic.partitions =1000 --默認1000,表示一個動態分區語句可以創建的最大動態分區個數,超出報錯 set hive.exec.max.created.files =10000 --默認10000,全局可以創建的最大文件個數,超出報錯。
4. hive導入方式
hive包括以下四種數據導入方式:
- 從本地文件系統中導入數據到Hive表;
- 從HDFS上導入數據到Hive表;
- 在創建表的時候通過從別的表中查詢出相應的記錄並插入到所創建的表中;
- 從別的表中查詢出相應的數據並導入到Hive表中。
4.1 INSERT INTO
INSERT INTO TABLE tablename1 SELECT a, b, c FROM tablename2;
4.2 INSERT OVERWRITE
INSERT OVERWRITE TABLE tablename1 SELECT a, b, c FROM tablename2;
INSERT INTO 與 INSERT OVERWRITE 都可以向hive表中插入數據,但是INSERT INTO直接追加到表中數據的尾部,而INSERT OVERWRITE會重寫數據,即先進行刪除,再寫入。如果存在分區的情況,INSERT OVERWRITE會只重寫當前分區數據。