Hive中Bucket的應用


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

  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介紹完畢!

 

博文是轉載的...

岑玉海: http://www.cnblogs.com/cenyuhai/p/3323467.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM