為什么分桶
(1)獲得更高的查詢處理效率。桶為表加上了額外的結構,Hive 在處理有些查詢時能利用這個結構。具體而言,連接兩個在(包含連接列的)相同列上划分了桶的表,可以使用 Map 端連接 (Map-side join)高效的實現。比如JOIN操作。對於JOIN操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作。那么將保存相同列值的桶進行JOIN操作就可以,可以大大較少JOIN的數據量。
(2)提升采樣(sampling)效率;
什么時候分桶
需要Map-side join 和 sampling時
選什么字段分桶
1.int類型字段比較友好
2.取hash后各分區塊數據量比較均勻的字段
3.join的連接字段
當join連接的字段值取hash不夠均勻時,多取一個其它字段作為分桶字段;
分桶公式:
bucket num = hash_function(bucketing_column) mod num_buckets
列的值做哈希取余 決定數據應該存儲到哪個桶
設置多少個 INTO 個數 BUCKETS
當數據量夠大時設置為約等於≈128M的倍數
當數據量不夠大時考慮,計算的並行度(比如129MB設置2 或者4 )
bucket個數會決定在該表或者該表的分區對應的hdfs目錄下生成對應個數的文件,而mapreduce的個數是根據文件塊的個數據確定的map個數。