Hive分區是指按照數據表的某列或某些列分爲多個區,區從形式上能夠理解爲文件夾,這樣能夠實現取數據的時候,某個分區取出來的數據就是所須要的分區數據。
經常使用的分區字段有:按時間分區,按業務分區等。ide
#建立分區表 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 分桶是比分區更細粒度的數據劃分,能夠指定分桶表的某一列,讓該列數據按照哈希取模的方式隨機、均勻地分發到各個桶文件中。
由於分桶操做須要根據某一列具體數據來進行哈希取模操做,故指定的分桶列必須基於表中的某一列(字段)。分桶改變了數據的存儲方式,它會把哈希取模相同或者在某一區間的數據行放在同一個桶文件中。code
如此一來即可提升查詢效率,好比咱們要對兩張在同一列上進行了分桶操做的表進行JOIN操做的時候,只須要對保存相同列值的桶進行JOIN操做便可。同時分桶也能夠提升採樣率。orm
分桶表的好處:
得到更高的查詢處理效率:桶爲表加上了額外的結構,Hive 在處理有些查詢時能利用這個結構。具體而言,鏈接兩個在(包含鏈接列的)相同列上劃分了桶的表,可使用 Map 端鏈接 (Map-side join)高效的實現。好比JOIN操做。對於JOIN操做兩個表有一個相同的列,若是對這兩個表都進行了桶操做。那麼將保存相同列值的桶進行JOIN操做就能夠,能夠大大較少JOIN的數據量。開發
使取樣(sampling)更高效:在處理大規模數據集時,在開發和修改查詢的階段,若是能在數據集的一小部分數據上試運行查詢,會帶來不少方便。string
#經常使用指令: #建立分桶表 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_0it
對動態分區表寫入數據時,要開啓容許動態分區寫入。
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;io