1. 程式人生 > >Hive(10)-檔案儲存格式

Hive(10)-檔案儲存格式

Hive支援的儲存資料的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET

 

一. 列式儲存和行式儲存

左邊為邏輯表,右邊第一個為行式儲存,第二個為列式儲存

1. 行式儲存的特點

查詢滿足條件的一整行資料的時候,列儲存則需要去每個聚集的欄位找到對應的每個列的值,行儲存只需要找到其中一個值,其餘的值都在相鄰地方,所以此時行儲存查詢的速度更快。

2.列式儲存的特點

因為每個欄位的資料聚集儲存,在查詢只需要少數幾個欄位的時候,能大大減少讀取的資料量;每個欄位的資料型別一定是相同的,列式儲存可以針對性的設計更好的設計壓縮演算法。

TEXTFILE和SEQUENCEFILE的儲存格式都是基於行儲存的;

ORC和PARQUET是基於列式儲存的。

 

 二. TextFile格式

預設格式,資料不做壓縮,磁碟開銷大,資料解析開銷大。可結合Gzip、Bzip2使用,但使用Gzip這種方式,hive不會對資料進行切分,從而無法對資料進行並行操作。

 

三. Orc格式

Orc (Optimized Row Columnar)是Hive 0.11版裡引入的新的儲存格式。

每個Orc檔案由1個或多個stripe組成,每個stripe一般為HDFS的塊大小,每一個stripe包含多條記錄,這些記錄按照列進行獨立儲存,對應到Parquet中的row group的概念。每個Stripe裡有三部分組成,分別是Index Data,Row Data,Stripe Footer.

1)Index Data:一個輕量級的index,預設是每隔1W行做一個索引。這裡做的索引應該只是記錄某行的各欄位在Row Data中的offset。

2)Row Data:存的是具體的資料,先取部分行,然後對這些行按列進行儲存。對每個列進行了編碼,分成多個Stream來儲存。

3)Stripe Footer:存的是各個Stream的型別,長度等資訊。

每個檔案有一個File Footer,這裡面存的是每個Stripe的行數,每個Column的資料型別資訊等;每個檔案的尾部是一個PostScript,這裡面記錄了整個檔案的壓縮型別以及FileFooter的長度資訊等。在讀取檔案時,會seek到檔案尾部讀PostScript,從裡面解析到File Footer長度,再讀FileFooter,從裡面解析到各個Stripe資訊,再讀各個Stripe,即從後往前讀。

 

四. Parquet格式

Parquet檔案是以二進位制方式儲存的,所以是不可以直接讀取的,檔案中包括該檔案的資料和元資料,因此Parquet格式檔案是自解析的。

1) 行組(Row Group):每一個行組包含一定的行數,在一個HDFS檔案中至少儲存一個行組,類似於orc的stripe的概念。

2) 列塊(Column Chunk):在一個行組中每一列儲存在一個列塊中,行組中的所有列連續的儲存在這個行組檔案中。一個列塊中的值都是相同型別的,不同的列塊可能使用不同的演算法進行壓縮。

3) 頁(Page):每一個列塊劃分為多個頁,一個頁是最小的編碼的單位,在同一個列塊的不同頁可能使用不同的編碼方式。

通常情況下,在儲存Parquet資料的時候會按照Block大小設定行組的大小,由於一般情況下每一個Mapper任務處理資料的最小單位是一個Block,這樣可以把每一個行組由一個Mapper任務處理,增大任務執行並行度。

 

一個檔案中可以儲存多個行組,檔案的首位都是該檔案的Magic Code,用於校驗它是否是一個Parquet檔案,Footer length記錄了檔案元資料的大小,通過該值和檔案長度可以計算出元資料的偏移量,檔案的元資料中包括每一個行組的元資料資訊和該檔案儲存資料的Schema資訊。除了檔案中每一個行組的元資料,每一頁的開始都會儲存該頁的元資料,在Parquet中,有三種類型的頁:資料頁、字典頁和索引頁。資料頁用於儲存當前行組中該列的值,字典頁儲存該列值的編碼字典,每一個列塊中最多包含一個字典頁,索引頁用來儲存當前行組下該列的索引,目前Parquet中還不支援索引頁。