1. 程式人生 > >HIVE—索引、分區和分桶的區別

HIVE—索引、分區和分桶的區別

處理 拆分 功能 分布 哈希函數 對比 part 一致性 進一步

一、索引

簡介

Hive支持索引,但是Hive的索引與關系型數據庫中的索引並不相同,比如,Hive不支持主鍵或者外鍵。

Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapReduce任務中需要讀取的數據塊的數量。

為什麽要創建索引?

Hive的索引目的是提高Hive表指定列的查詢速度。
沒有索引時,類似‘WHERE tab1.col1 = 10‘ 的查詢,Hive會加載整張表或分區,然後處理所有的rows,
但是如果在字段col1上面存在索引時,那麽只會加載和處理文件的一部分。
與其他傳統數據庫一樣,增加索引在提升查詢速度時,會消耗額外資源去創建索引表和需要更多的磁盤空間存儲索引。

二、分區

簡介

為了對表進行合理的管理以及提高查詢效率,Hive可以將表組織成“分區”。

分區是表的部分列的集合,可以為頻繁使用的數據建立分區,這樣查找分區中的數據時就不需要掃描全表,這對於提高查找效率很有幫助。

分區是一種根據“分區列”(partition column)的值對表進行粗略劃分的機制。Hive中每個分區對應著表很多的子目錄,將所有的數據按照分區列放入到不同的子目錄中去。

為什麽要分區?

龐大的數據集可能需要耗費大量的時間去處理。在許多場景下,可以通過分區的方法減少每一次掃描總數據量,這種做法可以顯著地改善性能。

數據會依照單個或多個列進行分區,通常按照時間、地域或者是商業維度進行分區。比如vido表,分區的依據可以是電影的種類和評級,另外,按照拍攝時間劃分可能會得到更一致的結果。為了達到性能表現的一致性,對不同列的劃分應該讓數據盡可能均勻分布。最好的情況下,分區的劃分條件總是能夠對應where語句的部分查詢條件。

Hive的分區使用HDFS的子目錄功能實現。每一個子目錄包含了分區對應的列名和每一列的值。但是由於HDFS並不支持大量的子目錄,這也給分區的使用帶來了限制。我們有必要對表中的分區數量進行預估,從而避免因為分區數量過大帶來一系列問題。

Hive查詢通常使用分區的列作為查詢條件。這樣的做法可以指定MapReduce任務在HDFS中指定的子目錄下完成掃描的工作。HDFS的文件目錄結構可以像索引一樣高效利用。

三、分桶(桶表)

簡介

桶是通過對指定列進行哈希計算來實現的,通過哈希值將一個列名下的數據切分為一組桶,並使每個桶對應於該列名下的一個存儲文件。

為什麽要分桶?

在分區數量過於龐大以至於可能導致文件系統崩潰時,我們就需要使用分桶來解決問題了。

分區中的數據可以被進一步拆分成桶,不同於分區對列直接進行拆分,桶往往使用列的哈希值對數據打散,並分發到各個不同的桶中從而完成數據的分桶過程。

註意,hive使用對分桶所用的值進行hash,並用hash結果除以桶的個數做取余運算的方式來分桶,保證了每個桶中都有數據,但每個桶中的數據條數不一定相等。

哈希函數的選擇依賴於桶操作所針對的列的數據類型。除了數據采樣,桶操作也可以用來實現高效的Map端連接操作。

記住,在數據量足夠大的情況下,分桶比分區,更高的查詢效率。

四、總結

索引和分區最大的區別就是索引不分割數據庫,分區分割數據庫。

索引其實就是拿額外的存儲空間換查詢時間,但分區已經將整個大數據庫按照分區列拆分成多個小數據庫了。

分區和分桶最大的區別就是分桶隨機分割數據庫,分區是非隨機分割數據庫。

因為分桶是按照列的哈希函數進行分割的,相對比較平均;而分區是按照列的值來進行分割的,容易造成數據傾斜。

其次兩者的另一個區別就是分桶是對應不同的文件(細粒度),分區是對應不同的文件夾(粗粒度)。

註意:普通表(外部表、內部表)、分區表這三個都是對應HDFS上的目錄,桶表對應是目錄裏的文件

推薦大家學習的時候HIVE、HDFS、MYSQL三者結合一起看,更容易理解其中的原理。

HIVE—索引、分區和分桶的區別