hive分桶表的學習

2022-06-29 18:33:09 字數 2713 閱讀 8465

每乙個表或者分割槽,hive都可以進一步組織成桶,桶是更細粒度的資料劃分,他本質不會改變表或分割槽的目錄組織方式,他會改變資料在檔案中的分布方式。

分桶規則:對分桶字段值進行雜湊,雜湊值除以桶的個數求餘,餘數決定了該條記錄在哪個桶中,也就是餘數相同的在乙個桶中。

桶為表加上額外結構,鏈結相同列劃分了桶的表,可以使用map-side join更加高效。

優點:1、提高join查詢效率 2、提高抽樣效率
通過 clustered by(欄位名) into bucket_num buckets 分桶,意思是根據欄位名分成bucket_num個桶

create

table

test_bucket (

id int comment 'id'

, name string comment '名字

')comment

'測試分桶

'clustered

by(id) into

4buckets

row format delimited fields terminated by'

,';

buckt_data.txt

1,name1

2,name2

3,name3

4,name4

5,name5

6,name6

7,name7

8,name8

9,name9

直接load data不會有分桶的效果,這樣和不分桶一樣,在hdfs上只有乙個檔案。

load data local inpath '/opt/test/buckt_data.txt' into table test_bucket;
需要借助中間表

create table text_bucket_test (

id int comment 'id',

name string comment '名字'

)comment '測試分桶中間表'

row format delimited fields terminated by ',' ;

先將資料load到中間表

load data local inpath '/opt/test/buckt_data.txt' into table text_bucket_test;
然後通過下面的語句,將中間表的資料插入到分桶表中,這樣會產生四個檔案。

insert into test_bucket select * from text_bucket_test;
然後我們檢視分桶表的資料目錄,發現好像也只有乙個檔案,並沒有按之前的4個檔案,也就是4個桶這樣來劃分。

分桶也就是分割槽,分割槽數量等於檔案數,所以上面方法並沒有分桶。

所以需要開啟強制分桶:

set hive.enforce.bucketing = true;   開啟強制分桶
重新匯入資料:

insert into  test_bucket  select *  from text_bucket_test;
發現組織檔案的有變化:

用sql看和用hadoop命令看每個檔案,結果每個桶內都是按id公升序排序的,也就是和最開始的截圖是一樣的

因為每個桶內的資料是排序的,這樣每個桶進行連線時就變成了高效的歸併排序

假設表a和表b進行join,join的字段為id

條件:這樣join查詢時候,表a的每個桶就可以和表b對應的桶直接join,而不用全表join,提高查詢效率

比如a表桶數為4,b表桶數為8,那麼桶數對應關係為

表a表b00

1122

3304

1526

37

hive> select * from test_bucket tablesample (bucket 1 out of 2);

ok8name8

4name4

2name2

6 name6

hive> select * from txt_bucket_test tablesample (bucket 1 out of 2on id);

ok2name2

8name8

4name4

6 name6

tablesample (bucket x out of y on id);

x表示從哪個桶(x-1)開始,y代表分幾個桶,也可以理解分x為分子,y為分母,及將表分為y份(桶),取第x份(桶)

所以這時對於分桶表是有要求的,y為桶數的倍數或因子,

y必須是table總bucket數的倍數或者因子。hive根據y的大小,決定抽樣的比例。例如,table總共分了64份,當y=32時,抽取(64/32=)2個bucket的資料,當y=128時,抽取(64/128=)1/2個bucket的資料。

x表示從哪個bucket開始抽取。例如,table總bucket數為32,tablesample(bucket 3 out of 16),表示總共抽取(32/16=)2個bucket的資料,分別為第3個bucket和第(3+16=)19個bucket的資料。

hive分桶表join Hive分桶表

測試資料 95001,李勇,男,20,cs 95002,劉晨,女,19,is 95003,王敏,女,22,ma 95004,張立,男,19,is 95005,男,18,ma 95006,孫慶,男,23,cs 95007,易思玲,女,19,ma 95008,李娜,女,18,cs 95009,夢圓圓,女...

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

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

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

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