【Hive】hive表的文件存儲格式

在Hive中,文件的存儲格式主要有:TEXTFILE、SEQUENCEFILE、ORC、PARQUET。
其中,TEXTFILE、SEQUENCEFILE是基於行存儲,ORC、PARQUET基於列存儲

1. 行存儲和列存儲

在這裏插入圖片描述
上圖中左邊爲邏輯表,右上爲行存儲,右下爲列存儲。
當查詢結果爲一整行的時候,行存儲效率會高一些;當查詢表中某幾列時,列存儲的效率會更高。
在對數據的壓縮方面,列存儲比行存儲更有優勢,所以列存儲佔用空間相對小一些。

2. TEXTFILE

TEXTFILE是Hive的默認存儲格式,數據不做壓縮,磁盤開銷大。實際生產中很少用TEXTFILE存儲。

3. ORC

ORC(Optimized Row Columnar)從Hive0.11.0開始出現,提高了Hive在寫入、讀取、計算數據時的性能。ORC文件默認使用ZLIB壓縮
ORC文件由stripe、file footer、postscript三部分組成:
在這裏插入圖片描述

3.1 Stripe

一個ORC文件,可以包含多個Stripe,Stripe默認大小250M。
Stripe由Index Data、Row Data、Stripe Footer三部分組成。
(1)Index Data
輕量級索引,默認每隔1w行做一個索引,目的是記錄某行的各個字段在Row Data中的偏移量。
(2)Row Data
真正存儲數據的部分,對每個列進行編碼存儲。
(3)Stripe Footer
存儲stripe的元數據信息。

3.2 File Footer

每個ORC文件中存有一個file footer,裏面記錄了各個stripe存儲的行數,每個列的數據類型等信息。

3.3 Postscript

Postscript在ORC文件的尾部,記錄了整個文件的壓縮類型、File Footer的長度信息等。ORC文件是從後往前讀的,先讀取Postscript,獲取File Footer的信息,再從File Footer裏讀取Stripe的信息,最後定位到需要讀取的數據。

Hive中可以採用如下三種方式使數據存儲到ORC文件中:

(1) CREATE TABLE ... STORED AS ORC
(2) ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
(3) SET hive.default.fileformat=Orc

Hive 0.14.0版本後還可以使用CONCATENATE命令合併ORC文件:

ALTER TABLE table_name [PARTITION partition_spec] CONCATENATE
4. PARQUET

Parquet是面向分析型系統的列式存儲格式,由Twitter和Cloudera合作開發,2015年5月成爲Apache的頂級項目。
Parquet文件是以二進制格式存儲的,所以不能直接讀取。
通常情況下,Parquet文件在存儲時會按照Block大小設置行組(Row Group)的大小,這樣Parquet文件就可以被多個mapper處理,增加了任務的並行度。
Parquet文件格式如下圖所示:
在這裏插入圖片描述
一個Parquet文件中可以存儲多個行組,文件的首位都是該文件的Magic Number,用於校驗它是否是一個Parquet文件。
Footer length記錄了文件元數據的大小,通過該值和文件長度可以計算出元數據的偏移量,文件的元數據中包括每一個行組的元數據信息和該文件存儲數據的Schema信息。
除了文件中每一個行組的元數據,每一頁的開始都會存儲該頁的元數據,在Parquet中,有三種類型的頁:數據頁、字典頁和索引頁。
數據頁:用於存儲當前行組中該列的值;
字典頁:存儲該列值的編碼字典,每一個列塊中最多包含一個字典頁;
索引頁:用來存儲當前行組下該列的索引,目前Parquet中還不支持索引頁。
由於Parquet在Hive 0.10 - 0.12中以插件形式存在,Hive 0.13及以後版本才得以集成,所以建表語句有所不同。
Hive 0.10 - 0.12:

CREATE TABLE parquet_test (
 id int,
 str string,
 mp MAP<STRING,STRING>,
 lst ARRAY<STRING>,
 strct STRUCT<A:STRING,B:STRING>) 
PARTITIONED BY (part string)
ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe'
 STORED AS
 INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat'
 OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat';

Hive 0.13+:

CREATE TABLE parquet_test (
 id int,
 str string,
 mp MAP<STRING,STRING>,
 lst ARRAY<STRING>,
 strct STRUCT<A:STRING,B:STRING>) 
PARTITIONED BY (part string)
STORED AS PARQUET;
總結

Hive支持的文件格式主要有:行存儲(TEXTFILE、SEQUENCEFILE) 和列存儲(ORC、PARQUET);
在實際生產環境,使用ORC和PARQUET的情況比較多;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章