smb 存在的目的主要是為了解決大表與大表間的 join 問題,分桶其實就是把大表化成了「小表」,然後 map-side join 解決之,這是典型的分而治之的思想。在聊 smb join 之前,我們還是先複習下相關的基礎概念。
在hive select查詢中一般會掃瞄整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃瞄表中關心的一部分資料,因此建表時引入了partition概念。分割槽表指的是在建立表時指定的partition的分割槽空間。
hive可以對資料按照某列或者某些列進行分割槽管理,所謂分割槽我們可以拿下面的例子進行解釋。
當前網際網路應用每天都要儲存大量的日誌檔案,幾g、幾十g甚至更大都是有可能。儲存日誌,其中必然有個屬性是日誌產生的日期。在產生分割槽時,就可以按照日誌產生的日期列進行劃分。把每一天的日誌當作乙個分割槽。
將資料組織成分區,主要可以提高資料的查詢速度。至於使用者儲存的每一條記錄到底放到哪個分割槽,由使用者決定。即使用者在載入資料的時候必須顯示的指定該部分資料放到哪個分割槽。
1.1 實現細節
1、乙個表可以擁有乙個或者多個分割槽,每個分割槽以資料夾的形式單獨存在表資料夾的目錄下。
2、表和列名不區分大小寫。
3、分割槽是以字段的形式在表結構中存在,通過describe table命令可以檢視到字段存在, 但是該字段不存放實際的資料內容,僅僅是分割槽的表示(偽列) 。
對於每乙個表(table)或者分割槽, hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。hive也是 針對某一列進行桶的組織。hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。
把錶(或者分割槽)組織成桶(bucket)有兩個理由:
(1)獲得更高的查詢處理效率。桶為表加上了額外的結構,hive 在處理有些查詢時能利用這個結構。具體而言,連線兩個在(包含連線列的)相同列上劃分了桶的表,可以使用 map 端連線 (map-side join)高效的實現。比如join操作。對於join操作兩個表有乙個相同的列,如果對這兩個表都進行了桶操作。那麼將儲存相同列值的桶進行join操作就可以,可以大大較少join的資料量。
(2)使取樣(sampling)更高效。在處理大規模資料集時,在開發和修改查詢的階段,如果能在資料集的一小部分資料上試執行查詢,會帶來很多方便。
Hive分割槽 分桶
create table t user partition id int name string partitioned by country string row format delimited fields terminated by load data local inpath root h...
Hive分割槽 分桶
2 靜態分割槽 二 hive分桶 1.分割槽列的值將表劃分為乙個個的資料夾 2.查詢時語法使用 分割槽 列和常規列類似 3.查詢時hive會只從指定分割槽查詢資料,提高查詢效率 建立單級分割槽表 create table ifnot exists employee partition name st...
hive的分桶,和分割槽
開啟分桶模式 set hive.enforce.bucketing true 制定reduce個數是4 set mapreduce.job.reduces 4 建立乙個分桶表 create table stu buck sno int,sname string,string,sage int,sde...