大數據--hive文件存儲格式

1、hive文件存儲格式算法

Hive支持的存儲數的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET。app

 

 

 

上圖左邊爲邏輯表,右邊第一個爲行式存儲,第二個爲列式存儲。編碼

行存儲的特色: 查詢知足條件的一整行數據的時候,列存儲則須要去每一個彙集的字段找到對應的每一個列的值,行存儲只須要找到其中一個值,其他的值都在相鄰地方,因此此時行存儲查詢的速度更快。spa

列存儲的特色: 由於每一個字段的數據彙集存儲,在查詢只須要少數幾個字段的時候,能大大減小讀取的數據量;每一個字段的數據類型必定是相同的,列式存儲能夠針對性的設計更好的設計壓縮算法。設計

TEXTFILE和SEQUENCEFILE的存儲格式都是基於行存儲的;ORC和PARQUET是基於列式存儲的。3d

一、行存儲textFile 格式blog

默認格式,數據不作壓縮,磁盤開銷大,數據解析開銷大。可結合Gzip、Bzip2使用,但使用Gzip這種方式,hive不會對數據進行切分,從而沒法對數據進行並行操做。索引

二、列存儲orc格式ip

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

能夠看到每一個Orc文件由1個或多個stripe組成,每一個stripe250MB大小,這個Stripe實際至關於RowGroup概念,不過大小由4MB->250MB,這樣應該能提高順序讀的吞吐率。每一個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是面向分析型業務的列式存儲格式,由TwitterCloudera合做開發,20155月從Apache的孵化器裏畢業成爲Apache頂級項目。

Parquet文件是以二進制方式存儲的,因此是不能夠直接讀取的,文件中包括該文件的數據和元數據,所以Parquet格式文件是自解析的。

一般狀況下,在存儲Parquet數據的時候會按照Block大小設置行組的大小,因爲通常狀況下每個Mapper任務處理數據的最小單位是一個Block,這樣能夠把每個行組由一個Mapper任務處理,增大任務執行並行度。Parquet文件的格式以下圖所示。

 

 

上圖展現了一個Parquet文件的內容,一個文件中能夠存儲多個行組,文件的首位都是該文件的Magic Code,用於校驗它是不是一個Parquet文件,Footer length記錄了文件元數據的大小,經過該值和文件長度能夠計算出元數據的偏移量,文件的元數據中包括每個行組的元數據信息和該文件存儲數據的Schema信息。除了文件中每個行組的元數據,每一頁的開始都會存儲該頁的元數據,在Parquet中,有三種類型的頁:數據頁、字典頁和索引頁。數據頁用於存儲當前行組中該列的值,字典頁存儲該列值的編碼字典,每個列塊中最多包含一個字典頁,索引頁用來存儲當前行組下該列的索引,目前Parquet中還不支持索引頁。

存儲文件的壓縮比總結:

ORC >  Parquet >  textFile

存儲文件的查詢速度總結:查詢速度相近。

在實際的項目開發當中,hive表的數據存儲格式通常選擇:orc或parquet。壓縮方式通常選擇snappy,lzo。

相關文章
相關標籤/搜索