在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的情況比較多;