Hive的三種文件格式:TEXTFILE、SEQUENCEFILE、RCFILE中,TEXTFILE和SEQUENCEFILE的存儲格式都是基於行存儲的,RCFILE是基於行列混合的思想,先按行把數據划分成N個row group,在row group中對每個列分別進行存儲。另:Hive能支持自定義格式,詳情見:Hive文件存儲格式
基於HDFS的行存儲具備快速數據加載和動態負載的高適應能力,因為行存儲保證了相同記錄的所有域都在同一個集群節點。但是它不太滿足快速的查詢響應時間的要求,因為當查詢僅僅針對所有列中的 少數幾列時,它就不能跳過不需要的列,直接定位到所需列;同時在存儲空間利用上,它也存在一些瓶頸,由於數據表中包含不同類型,不同數據值的列,行存儲不 易獲得一個較高的壓縮比。RCFILE是基於SEQUENCEFILE實現的列存儲格式。除了滿足快速數據加載和動態負載高適應的需求外,也解決了SEQUENCEFILE的一些瓶頸。
下面對這幾種幾個作一個簡單的介紹:
TextFile:
Hive默認格式,數據不做壓縮,磁盤開銷大,數據解析開銷大。
可結合Gzip、Bzip2、Snappy等使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分,從而無法對數據進行並行操作。
SequenceFile:
SequenceFile是Hadoop API 提供的一種二進制文件,它將數據以<key,value>的形式序列化到文件中。這種二進制文件內部使用Hadoop 的標准的Writable 接口實現序列化和反序列化。它與Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 繼承自Hadoop API 的SequenceFile,不過它的key為空,使用value 存放實際的值, 這樣是為了避免MR 在運行map 階段的排序過程。
SequenceFile的文件結構圖:
Header通用頭文件格式:
SEQ |
3BYTE |
Nun |
1byte數字 |
keyClassName |
|
ValueClassName |
|
compression |
(boolean)指明了在文件中是否啟用壓縮 |
blockCompression |
(boolean,指明是否是block壓縮) |
compression |
codec |
Metadata |
文件元數據 |
Sync |
頭文件結束標志 |
Block-Compressed SequenceFile格式