【 精解: 建立桶表時,指定桶的個數,分桶的依據字段,hive就能夠自動將數據分桶存儲。查詢時只須要遍歷一個桶裏的數據,或者遍歷部分桶,這樣就提升了查詢效率。 】 對於每個表(table)或者分區,hive 能夠進一步組織成桶,也就是說桶是更爲細粒度的數據範圍劃分。hive也是針對某一列進行桶的組織。 hive採用對列hash,而後除以桶的個數求餘的方式決定該條記錄存放在哪一個桶當中。 `set hive.enforce.bucketing = true;` 把表(或者分區)組織成桶(Bucket)有兩個理由: 一、得到更高的查詢處理效率。桶爲表加上了額外的結構,hive在處理有些查詢時能利用這個結構。具體而言,鏈接兩個在(包含鏈接列的) 相同列劃分了桶的表,可使用map端鏈接(map-side join)高效的實現。好比join操做。對於join操做兩個表有一個相同的列,若是對這 兩個表都進行桶操做。那麼將保存相同列值得桶進行join操做就能夠,能夠大大減小join的數據。 二、使用樣(sampling)更高效。在處理大規模數據集時,在開發和修改查詢的階段,若是能在數據集的一小部分數據上試運行查詢,會帶來不少方便。 一、建立帶分區帶桶的table: create table bucketed_user ( id int, name string ) partitioned by (stat_date string) clustered by (id) sorted by (name) into 4 buckets row format delimited fields terminated by '\t' [stored as textfile]; -clustered by 是指根據id的值進行hash後取模分桶個數,根據獲得的結果,肯定這行數據分入哪一個桶中,這樣的分法,能夠確保相同id的數據放入同一個桶中。 而經銷商的線索數據,大部分是根據id進行查詢的。這樣大部分狀況下是隻須要查詢一個桶中的數據就能夠了。 -sorted by 是指定桶中的數據以哪一個字段進行排序,排序的好處是,在join操做時能得到很高的效率。 -into 4 buckets 是指定一共分多少個桶。 -在hdfs上存儲時,一個桶存入一個文件中,這樣根據id進行查詢時,能夠快速肯定數據存在於哪一個桶中,而只遍歷一個桶能夠提供查詢效率。 --插入數據 >from bucketed_user_tmp >insert overwrite table bucketed_user partition(stat_date="20171208") >select id,name where stat_date="20171207" sort by id; --取樣查看 >select * from bucketed_user tablesample(bucket 2 out of 2 on id); 首先,咱們來看如何告訴hive一個表應該被劃分紅桶。咱們使用clustered by子句來指定劃分桶所用的列和要劃分的桶的個數: create table bucketed_user ( id int, name string ) clustered by (id) into 4 buckets; 在這裏,咱們使用用戶ID來肯定如何劃分桶