網友南京-李先森給了他收集的一些資料,如下:
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介紹完畢!
博文是轉載的...