Hive分桶的作用

2021-07-29 19:32:40 字數 2113 閱讀 6699

分割槽的主要作用是可用允許我們只統計一部分內容,加快統計的速度。

假如我們有個表t_buck。

create table t_buck(id string,name string)

clustered by (id) sort by(id) into 4 buckets;

指定了根據id分成4個桶。

只是說明了表會分桶,具體的分割槽需要在匯入資料時產生。最好的匯入資料方式是insert into table;

開始的時候我們的資料都是在一起的,按照上面的分桶結果,會在表目錄下產生多個檔案:/user/hive/warehouse/test_db/t_buk/

000001_0

000002_0

000003_0

000004_0

每個檔案中的內容是根據hash雜湊後得到的結果。

使用下面的**建立表:

create table t_p(id string,name string)

row format delimited fields terminated by ',';

load data local inpath '/root/buck.data' overwrite into table t_p;

create table t_buck(id string,name string)

clustered by(id) sorted by(id)

into 4 buckets

row format delimited fields terminated by ',';

# 要開啟模式開關

set hive.enforce.bucketing = true;

set mapreduce.job.reduces=4;

# 查詢時cluster by指定的字段就是partition時分區的key

# 每個區中的資料根據id排序。

insert into table t_buck

select * from t_p cluster by(id);

來看一下sort by的結果。

set mapreduce.job.reduces=4;

select * from t_p sort by id;

輸出結果為:

+---------+-----------+--+

| t_p.id | t_p.name |

+---------+-----------+--+

| 12 | 12 |

| 13 | 13 |

| 4 | 4 |

| 8 | 8 |

| 14 | 14 |

| 2 | 2 |

| 6 | 6 |

| 1 | 1 |

| 10 | 10 |

| 11 | 11 |

| 3 | 3 |

| 5 | 5 |

| 7 | 7 |

| 9 | 9 |

+---------+-----------+--+

明顯看出是每個reduce中有序而不是全域性有序。

cluster by(id) = distribute by(id) sort by(id)
distribute by(id)指定分發字段,sort by指定排序字段。

觀察下面的語句。

select a.id,a.name,b.addr from a join b on a.id = b.id;
如果a表和b表已經是分桶表,而且分桶的字段是id欄位,那麼做這個操作的時候就不需要再進行全表笛卡爾積了。但是如果標註了分桶但是實際上資料並沒有分桶,那麼結果就會出問題。

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

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

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

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

Hive分桶筆記

分桶表與其他表的區別 分桶表是從別的表查詢的資料在insert到分桶表中 而其他表是load clustered by id into 4 buckets 通過id hash雜湊 建立分桶表 create table stu buck sno int,sname string,string,sage...