Hive中的分桶

2021-08-15 14:30:33 字數 3292 閱讀 9735

對於每乙個表(table)或者分割槽, hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。hive也是針對某一列進行桶的組織。hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。

把錶(或者分割槽)組織成桶(bucket)有兩個理由:

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

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

按我的理解,所謂hive中的分桶,實際就是指的mapreduce中的分割槽。根據reduce的數量,分成不同個數的檔案。

我們以乙個demo進行說明。

建立分桶表

drop

table

stu_buck;

create

table stu_buck(id int, name string, score double

)clustered

by(id)

sorted

by(id asc

)into

4buckets

row format delimited

fields terminated by『

,『;

設定變數,設定分桶為true, 設定reduce數量是分桶的數量個數

set hive.enforce.bucketing =

true;

set mapreduce.job.reduces=

4;

我們從另外乙個表student查詢資料放到該表中,student中的表資料如下:

開始往建立的分通表插入資料(插入資料需要是已分桶, 且排序的)

可以使用distribute by(id) sort by(id asc)

排序和分桶的字段相同的時候也可以使用cluster by(字段)

注意使用cluster by 就等同於分桶+排序(sort)

可以嘗試以下幾種方式:

insert

into

table

stu_buck

select id,name,score from student distribute by(id) sort by(id asc

);insert overwrite table

stu_buck

select id,name,score from student distribute by(id) sort by(id asc

);insert overwrite table

stu_buck

select id,name,score from student cluster by

(id);

insert overwrite table

stu_buck

select id,name,score from student cluster by(id) sort by(id); 報錯,cluster 和 sort 不能共存

效果:

我們來檢視以下檔案的內容:

注:1、order by 會對輸入做全域性排序,因此只有乙個reducer,會導致當輸入規模較大時,需要較長的計算時間。

2、sort by不是全域性排序,其在資料進入reducer前完成排序。因此,如果用sort by進行排序,並且設定mapred.reduce.tasks>1,則sort by只保證每個reducer的輸出有序,不保證全域性有序。

3、distribute by(字段)根據指定的字段將資料分到不同的reducer,且分發演算法是hash雜湊。

4、cluster by(字段) 除了具有distribute by的功能外,還會對該字段進行排序。

5、建立分桶表並不意味著load進資料也是分桶的,你必須先分好桶,然後再放到表中。

因此,如果分桶和sort欄位是同乙個時,此時,cluster by = distribute by + sort by

分桶表的作用:最大的作用是用來提高join操作的效率;但是兩者的分桶數要相同或者成倍數。

為什麼可以提高join操作的效率呢?因為按照mapreduce的分割槽演算法,是id的hashcode值模上reducetasknumbers,所以乙個id會分到同乙個桶中,這樣合併就不用整個表遍歷求笛卡爾積了,對應的桶合併就可以了。

hive 修改分桶數 分桶表 Hive中的分桶

對於每乙個表 table 或者分割槽,hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。hive也是針對某一列進行桶的組織。hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。把錶 或者分割槽 組織成桶 bucket 有兩個理由 1 獲得更高的查詢處理效率...

Hive學習筆記 Hive中的分桶

對於每乙個表 table 或者分割槽,hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。hive也是針對某一列進行桶的組織。hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。把錶 或者分割槽 組織成桶 bucket 有兩個理由 1 獲得更高的查詢處理效率...

hive分桶 hive學習筆記之五 分桶

分割槽欄位的每個值都會建立乙個資料夾,值越多資料夾越多 不合理的分割槽會導致有的資料夾下資料過多,有的過少 set hive.enforce.bucketing true 如果不執行上述設定,您需要自行設定mapred.reduce.tasks引數,以控制reducers數量,本文咱們配置為hive...