數據庫分區的主要目的是為了在特定的SQL操作中減少數據讀寫的總量以縮減響應時間,主要包括兩種分區形式:水平分區與垂直分區。水平分區是對表進行行分區。而垂直分區是對列進行分區,一般是通過對表的垂直划分來減少目標表的寬度,常用的是水平分區。
1、分區參數介紹¶
-
hive.exec.dynamic.partition:是否啟動動態分區。默認false。
-
hive.exec.dynamic.partition.mode:打開動態分區后,動態分區的模式為strict和nonstrict。
-
strict可設置為靜態和半動態,要求至少包含一個靜態分區列。
-
nonstrict可設置為靜態、半動態和動態,動態必須設置此參數。
-
-
hive.exec.max.dynamic.partitions:允許的最大的動態分區的個數。默認1000。
-
hive.exec.max.dynamic.partitions.pernode:一個mapreduce job所允許的最大的動態分區的個數。默認是100。
2、分區表的創建¶
(1)分區表創建
create table test.user_list(
user_id string,
msisdn string,
imsi string)
partitioned by (city string,sdate string)
row format delimited fields terminated by ',';
(2)臨時表創建(輔助分區表測試)
create table test.user_list_tmp(
user_id string,
msisdn string,
imsi string
city string,
sdate string)
row format delimited fields terminated by ',';
3、數據插入方式¶
(1)靜態分區插入數據:
insert into table user_list partition(city='HANGZHOU',sdate='20200101')
select
t.user_id,
t.msisdn,
t.imsi
from test.user_list_tmp t
(2)動靜混合分區插入數據
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=strick;
--set hive.exec.dynamic.partition.mode=nonstrick;
insert into table user_list partition(city='HANGZHOU',sdate)
select
t.user_id,
t.msisdn,
t.imsi,
t.sdate
from test.user_list_tmp t
注意:動靜分區混合時,靜態分區參數必須放置在前面。
(3)動態分區插入數據
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrick;
insert into table user_list partition(city,sdate)
select
t.user_id,
t.msisdn,
t.imsi,
t.city,
t.sdate
from test.user_list_tmp t
4、insert into 和 insert overwrite¶
insert into示例:
insert into table user_list partition(city='HANGZHOU',sdate='20200101')
select
t.user_id,
t.msisdn,
t.imsi
from test.user_list_tmp t
insert overwrite示例:
insert overwrite table user_list partition(city='HANGZHOU',sdate='20200101')
select
t.user_id,
t.msisdn,
t.imsi
from test.user_list_tmp t
兩者區別:insert into直接追加到表中數據的尾部,而insert overwrite會重寫數據,既先進行刪除,再寫入。