1. 程式人生 > 實用技巧 >Hive 分割槽和分桶

Hive 分割槽和分桶

分割槽

Hive分割槽是指按照資料表的某列或某些列分為多個區,區從形式上可以理解為資料夾,這樣可以實現取資料的時候,某個分割槽取出來的資料就是所需要的分割槽資料。
常用的分割槽欄位有:按時間分割槽,按業務分割槽等。

#建立分割槽表
create table t1 (
id int,
name string,
age int
)
partitioned by (pdate string)
row format delimited fields terminated by '\001'
;

常用命令:
檢視分割槽資料:
select * from t1 where pdate='2020-01-01';

檢視有哪些分割槽:
show partitions t1;

向分割槽插入資料:
insert overwrite table t1 partition(pdate='2020-01-01')
select * from xxx
;

分桶

Hive 分桶是比分割槽更細粒度的資料劃分,可以指定分桶表的某一列,讓該列資料按照雜湊取模的方式隨機、均勻地分發到各個桶檔案中。
因為分桶操作需要根據某一列具體資料來進行雜湊取模操作,故指定的分桶列必須基於表中的某一列(欄位)。分桶改變了資料的儲存方式,它會把雜湊取模相同或者在某一區間的資料行放在同一個桶檔案中。

如此一來便可提高查詢效率,比如我們要對兩張在同一列上進行了分桶操作的表進行JOIN操作的時候,只需要對儲存相同列值的桶進行JOIN操作即可。同時分桶也可以提高取樣率。

分桶表的好處:
獲得更高的查詢處理效率:桶為表加上了額外的結構,Hive 在處理有些查詢時能利用這個結構。具體而言,連線兩個在(包含連線列的)相同列上劃分了桶的表,可以使用 Map 端連線 (Map-side join)高效的實現。比如JOIN操作。對於JOIN操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作。那麼將儲存相同列值的桶進行JOIN操作就可以,可以大大較少JOIN的資料量。

使取樣(sampling)更高效:在處理大規模資料集時,在開發和修改查詢的階段,如果能在資料集的一小部分資料上試執行查詢,會帶來很多方便。

#常用指令:
#建立分桶表
create table t2(
id int,
name string
)
clustered by (id) sorted by(id) into 4 buckets 
;

檢視分桶表:
dfs -ls /user/hive/warehouse/bucketed_users;
檔案結構如下所示:
/user/hive/warehouse/b_table1/000000_0
/user/hive/warehouse/b_table1/000001_0
/user/hive/warehouse/b_table1/000002_0
/user/hive/warehouse/b_table1/000003_0

動態分割槽表

對動態分割槽表寫入資料時,要開啟允許動態分割槽寫入。
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;