Hive文件存儲格式

列式存儲和行式存儲

在這裏插入圖片描述
上圖左邊爲邏輯表,右側上邊第一個爲行式存儲,下邊第二個爲列式存儲。

  • 行存儲的特點
    查詢滿足條件的一整行數據的時候,列存儲則需要去每個聚集的字段找到對應的每個列的值,而行存儲只需要找到其中一個值,其餘的值都在相鄰地方,所以此時行存儲查詢的速度更快。

  • 列存儲的特點
    因爲每個字段的數據聚集存儲,在查詢只需要少數幾個字段的時候,能大大減少讀取的數據量;每個字段的數據類型一定是相同的,列式存儲可以針對性的設計更好的壓縮算法。

Hive支持的文件存儲格式

Hive支持的存儲的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET,其中:

  • TEXTFILE和SEQUENCEFILE的存儲格式都是基於行存儲的
  • ORC和PARQUET主要是基於列式存儲的

TextFile格式

TextFile格式是默認格式,數據不做壓縮,磁盤開銷大,數據解析開銷大。
TextFile格式可結合Gzip、Bzip2使用。

注意:使用Gzip壓縮方式,hive不會對數據進行切分,從而無法對數據進行並行操作。

Orc格式

Orc (Optimized Row Columnar)是Hive 0.11版裏引入的新的存儲格式。
在這裏插入圖片描述
可以看到每個Orc文件由1個或多個stripe組成,每個stripe250MB大小,這個Stripe實際相當於RowGroup概念,不過大小由4MB->250MB,這樣能提升順序讀的吞吐率。

Orc實際上是行列存儲的:它實際上是將表按250M打開,250M內部按列存儲,2150M之間按行存儲。比如下圖每9組都是250M:
在這裏插入圖片描述
每個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文件是以二進制方式存儲的,所以是不可以直接讀取的,文件中包括該文件的數據和元數據,因此Parquet格式文件是自解析的。

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

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

Hive文件存儲格式壓縮比和查詢速度對比

  1. 測試數據
    zdg#12344321#[email protected]
    LaoZheng#670203313747#[email protected]
    fstao#730413#[email protected]
    huwolf#2535263#[email protected]
    cadcjl#KIC43dk6!#[email protected]
    netsky#s12345#[email protected]
    Michael#apple#[email protected]

TextFile

第一步:創建表,存儲數據格式爲TEXTFILE

在這裏插入圖片描述
第二步:加載數據到表中:
在這裏插入圖片描述
第三步:查看錶中數據大小
在這裏插入圖片描述

ORC

第一步:創建表,存儲數據格式爲ORC

在這裏插入圖片描述
第二步:加載數據到表中
在這裏插入圖片描述
第三步:查看錶中數據大小
在這裏插入圖片描述

Parquet

第一步:創建表,存儲數據格式爲parquet

在這裏插入圖片描述
第二步:加載數據到表中
在這裏插入圖片描述
第三步:查看錶中數據大小
在這裏插入圖片描述
比較:

格式 大小 查詢速度(用時)
TextFile 42.6M 0.279s
Ocr 19.8M 0.78s
Parquet 46.3M 0.236s

注:測試查詢速度,執行的是全表掃描:select * from 表名;

測試存儲和壓縮

非壓縮的orc存儲方式

第一步:創建表
在這裏插入圖片描述
第二步:添加數據
在這裏插入圖片描述
第三步:查看文件大小
在這裏插入圖片描述

snappy壓縮的orc存儲方式

第一步:創建表
在這裏插入圖片描述
第二步:導入數據
在這裏插入圖片描述
第三步:查看文件大小
在這裏插入圖片描述
orc存儲文件默認採用ZLIB壓縮。其壓縮率比snappy要高。

結論:

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

發佈了314 篇原創文章 · 獲贊 720 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章