Hive分桶之BUCKET詳解

2021-07-27 01:43:13 字數 2942 閱讀 4195

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

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

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

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

下面來乙個例子:

id bigint comment』編號』,(ps:comment為注釋)

name

string comment』姓名』

)comment』編號與姓名表』

partitioned by(pdate string)

clustered by(id) 按id分桶,自動雜湊分桶

sorted by(id) 按id排序

into 4 buckets 分成4個桶

row format delimited 設定建立的表在載入資料的時候,支援的列分隔符

fields terminated by 『\t』 每個欄位按\t分割

lines terminated by』\n』 stored as textfile; 按\n為斷行符,指定匯入的檔案為純文字。

hive本身支援的檔案格式只有:text file,sequence file,如果資料需要壓縮,使用 [stored as sequence]

夠詳細了吧,下面load資料:

插入資料之前需要設定引數hive.enforce.bucketing=true,以強制hive的reducer數目為分桶數。如果不設定這個hive引數,最後的桶個數可能不是建表語句中的個數。另外,也可以通過將引數mapred.reduce.tasks設定為桶的數目來控制reducer的數目,建議採用第一種方式。
set hive.enforce.bucketing=true;

load data local inpath』/home/hadoop/….』 overwrite into

table dz_test partition(pdate=『2015-10』)

物理上,每個桶就是表(或分割槽)目錄裡的乙個檔案。它的檔名並不重要,但是桶 n 是按照字典序排列的第 n 個檔案。事實上,桶對應於 mapreduce 的輸出檔案分割槽:乙個作業產生的桶(輸出檔案)和reduce任務個數相同。

我們可以通過檢視剛才 建立的bucketd_users表的布局來了解這一情況。執行如下命令:

檢視表的結構:

hive> dfs -ls /user/hive/warehouse/dz_test;

將顯示有4個新建的檔案。檔名如下(檔名包含時間戳,由hive產生,因此 每次執行都會改變):

attempt_201701221636_0016_r_000000_0

attempt_201701221636_0016_r-000001_0

attempt_201701221636_0016_r_000002_0

attempt_201701221636_0016_r_000003_0

第乙個桶裡包括使用者id和4,因為乙個int的雜湊值就是這個整數本身,在這裡 除以桶數(4)以後的餘數:2

讀取資料,看每乙個檔案的資料:

hive> dfs -cat /user/hive/warehouse/dz_test/*0_0;

0 nat

4 ann

用tablesample子句對錶進行取樣,我們可以獲得相同的結果。這個子句會將 查詢限定在表的一部分桶內,而不是使用整個表:

. 對桶中的資料進行取樣:

hive> select * from dz_test

>tablesample(bucket 1 out of

4on id);

0 nat

4 ann

桶的個數從1開始計數。因此,前面的查詢從4個桶的第乙個中獲取所有的使用者。 對於乙個大規模的、均勻分布的資料集,這會返回表中約四分之一的資料行。我們 也可以用其他比例對若干個桶進行取樣(因為取樣並不是乙個精確的操作,因此這個 比例不一定要是桶數的整數倍)。例如,下面的查詢返回一半的桶:

7. 查詢一半返回的桶數:

hive> select * from dz_test

> tablesample(bucket 1 out of

2on id);

0 nat

4 ann

2 joe

因為查詢只需要讀取和tablesample子句匹配的桶,所以取樣分桶表是非常高效 的操作。如果使用rand()函式對沒有劃分成桶的表進行取樣,即使只需要讀取很 小一部分樣本,也要掃瞄整個輸入資料集:

hive〉 select * from dz_test

> tablesample(bucket 1 out of

4on rand());

2 doe

①從hive 0.6

.0開始,對以前的版本,必須把mapred.reduce .tasks設為表中要填 充的桶的個數。如果桶是排序的,還需要把hive.enforce.sorting設為true。

②顯式原始檔案時,因為分隔字元是乙個不能列印的控制字元,因此欄位都擠在一起。

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

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

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

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

Hive分桶筆記

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