天天看點

Hive Tunning 補充 關于bucket

在前面的幾篇文章當中一直有一個概念bucketing不清楚到底是怎麼回事。

網友南京-李先森給了他收集的一些資料,如下:

buckets 對指定列計算 hash,根據 hash 值切分資料,目的是為了并行,每一個 bucket 對應一個檔案。如将 user 列分散至 32 個 bucket,首先對 user 列的值計算 hash,對應 hash 值為 0 的 hdfs 目錄為:/ warehouse /xiaojun/dt =20100801/ctry=us/part-00000;hash 值為 20 的 hdfs 目錄為:/ warehouse /xiaojun/dt =20100801/ctry=us/part-00020 

這段描述是說用了bucket之後的,那為什麼要用bucket,沒說,本着認真負責的态度,我從網上搜尋到了oreilly《programming.hive》這本書,然後在裡面找到了答案,現在發出來和大家分享一下。

首先回顧一下分區,分區是切分資料的一種比較友善的方法,比較常用的就是按照日期來進行切分,bucket(中文意思就是籃子,可以放雞蛋,哈哈)其實也是一種切分資料的方法。

假設我們有一張日志表,我們需要按照日期和使用者id來分區,目的是為了加快查詢誰哪天幹了什麼,如下:

但是這裡面用user_id去切分的話,就會産生很多很多的分區了,這些分區可大可小,這個數量是檔案系統所不能承受的。

在這種情況下,我們既想加快查詢速度,又避免出現如此多的小分區,籃子(bucket)就出現了。

具體的用法是:

首先按照日期分區,分區結束之後再按照user_id把日志放在96個籃子,這樣同一個使用者的所有日志都會在同一個籃子裡面,并且一個籃子裡面有好多使用者的日志。

然後我們在插入資料的時候就要注意了,我們一定要設定hive.enforce.bucketing為true。

到此,bucket介紹完畢!