Hive學習筆記(四)—Hive分桶表

一、分桶簡介

  • 桶是通過對指定列進行哈希計算來實現的,通過哈希值將一個列名下的數據切分爲一組桶,並使每個桶對應於該列名下的一個存儲文件
  • 將表中記錄按分桶鍵的哈希值分散進多個文件中,這些小文件稱爲桶
  • 對於每一個表或者分區,Hive 可以進一步組織成桶,也就是更爲細粒度的數據範圍劃分
  • Bucket是對指定列進行hash,然後根據hash值除以桶的個數進行求餘,決定該條記錄存放在哪個桶中

二、分桶操作

1. 創建桶表:

create table student(
id int,
age int,
name string
)
partitioned by (stat_date string)
clustered by (id) sorted by(age) into 2 bucket
row format delimited fields terminated by ',';

數據先partitioned by (stat_date string),再clustered by (id) sorted by(age) into 2 bucket,先分區再進行分桶

2. 設置環境變量:讓程序自動分配reduce的數量從而適配相應的bucket數量

 set hive.enforce.bucketing=true;

3. 插入數據:從臨時表導入數據,需要經過MR

from student_tmp
insert overwrite table student partition(stat_date='2019-10-08')
select id,age,name where stat_date='2019-10-07' sort by age;

4. 查看文件目錄:

hive> dfs -ls /user/hive/warehouse/student1/stat_date=2019-10-08;

兩個目錄:
/user/hive/warehouse/student1/stat_date=2019-10-08/000000_0
/user/hive/warehouse/student1/stat_date=2019-10-08/000001_0

5. 查看 sampling 數據

hive> select * from student1                     
    > TableSample(bucket 1 out of 2 on id); 

這裏指的是查詢 2/2 = 1個bucket數據,從第1個bucket開始

tablesample是抽樣語句,語法:TABLESAMPLE(BUCKET x OUT OF y)

  • x表示從哪個bucket開始抽取
  • y表示抽樣的比例,桶數/y

例如:桶數64,tablesample(bucket 3 out of 32)
總共抽取(64/32=)2個bucket的數據,分別爲第3個bucket和第(3+32=)35個bucket的數據

三、分桶的優缺點

  • 分桶取樣更高效,因爲在處理大規模的數據集時,在開發、測試階段將所有的數據全部處理一遍可能不太現實,如果一個表已經對某一列製作了bucket,就可以採樣所有桶中指定序號的某個桶,這就減少了訪問量
  • 爲了獲得更好的查詢處理效率, 桶爲了表提供了額外的結構,Hive在處理某些查詢時利用這個結構,能給有效地提高查詢效率
  • 連接兩個在相同列上劃分了桶的表,可以使用 Map-side Join 的高效實現,優化join操作(下一篇筆記會講)
  • 缺點:使用業務字段來查詢的話,沒有什麼效果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章