HIVE 索引 分割槽和分桶的區別

2022-03-21 16:32:27 字數 1767 閱讀 6379

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 索引 分割槽和分桶的區別

一 索引 hive支援索引,但是 hive 的索引與關係型資料庫中的索引並不相同,比如,hive 不支援主鍵或者外來鍵。hive索引可以建立在表中的某些列上,以提公升一些操作的效率,例如減少 mapreduce 任務中需要讀取的資料塊的數量。為什麼要建立索引?hive的索引目的是提高 hive 表指...

Hive分割槽和分桶區別

一.定義上 分割槽 建立分割槽表 create table student id int,name string,age int,address string partitioned by dt string,type string 制定分割槽 row format delimited fields...

Hive 分割槽 和 分桶 的區別

背景 hive使用select語句進行查詢的時候一般會掃瞄整個表內容,會消耗很多時間做沒必要的工作。hive可以在建立表的時候指定分割槽空間,這樣在做查詢的時候就可以很好的提高查詢的效率。分割槽 在hdfs上的表現形式是乙個目錄,分桶 在hdfs上的表現形式是乙個單獨的檔案 建立分割槽表 creat...