Hive筆記-bucket介紹

hive-bucket介紹

http://blog.csdn.net/yfkiss/article/details/7816916

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來分區,目的是為了加快查詢誰哪天干了什么,如下:

 CREATE TABLE weblog (url STRING, source_ip STRING)
> PARTITIONED BY (dt STRING, user_id INT);

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

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

具體的用法是:

CREATE TABLE weblog (user_id INT, url STRING, source_ip STRING)
> PARTITIONED BY (dt STRING)
> CLUSTERED BY (user_id) INTO 96 BUCKETS;

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

然后我們在插入數據的時候就要注意了,我們一定要設置hive.enforce.bucketing為true。

hive> SET hive.enforce.bucketing = true;
hive> FROM raw_logs
> INSERT OVERWRITE TABLE weblog
> PARTITION (dt='2009-02-25')
> SELECT user_id, url, source_ip WHERE dt='2009-02-25';

到此,bucket介紹完畢!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容