每乙個表或者分割槽,hive都可以進一步組織成桶,桶是更細粒度的資料劃分,他本質不會改變表或分割槽的目錄組織方式,他會改變資料在檔案中的分布方式。分桶規則:對分桶字段值進行雜湊,雜湊值除以桶的個數求餘,餘數決定了該條記錄在哪個桶中,也就是餘數相同的在乙個桶中。
桶為表加上額外結構,鏈結相同列劃分了桶的表,可以使用map-side join更加高效。
優點:1、提高join查詢效率 2、提高抽樣效率通過 clustered by(欄位名) into bucket_num buckets 分桶,意思是根據欄位名分成bucket_num個桶
createbuckt_data.txttable
test_bucket (
id int comment 'id'
, name string comment '名字
')comment
'測試分桶
'clustered
by(id) into
4buckets
row format delimited fields terminated by'
,';
1,name1直接load data不會有分桶的效果,這樣和不分桶一樣,在hdfs上只有乙個檔案。2,name2
3,name3
4,name4
5,name5
6,name6
7,name7
8,name8
9,name9
load data local inpath '/opt/test/buckt_data.txt' into table test_bucket;需要借助中間表
create table text_bucket_test (先將資料load到中間表id int comment 'id',
name string comment '名字'
)comment '測試分桶中間表'
row format delimited fields terminated by ',' ;
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必須是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的資料。所以這時對於分桶表是有要求的,y為桶數的倍數或因子,
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...