1. 程式人生 > >Hive的常用三種檔案儲存格式詳解

Hive的常用三種檔案儲存格式詳解

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通用標頭檔案格式:

SEQ3BYTE
Nun1byte數字
keyClassName
ValueClassName
compression(boolean)指明瞭在檔案中是否啟用壓縮
blockCompression(boolean,指明是否是block壓縮
compressioncodec
Metadata檔案元資料
Sync標頭檔案結束標誌

Block-Compressed SequenceFile格式


RCFile

RCFile是Hive推出的一種專門面向列的資料格式。 它遵循“先按列劃分,再垂直劃分”的設計理念。當查詢過程中,針對它並不關心的列時,它會在IO上跳過這些列。需要說明的是,RCFile在map階段從 遠端拷貝仍然是拷貝整個資料塊,並且拷貝到本地目錄後RCFile並不是真正直接跳過不需要的列,並跳到需要讀取的列, 而是通過掃描每一個row group的頭部定義來實現的,但是在整個HDFS Block 級別的頭部並沒有定義每個列從哪個row group起始到哪個row group結束。所以在讀取所有列的情況下,RCFile的效能反而沒有SequenceFile高。

行儲存

HDFS塊內行儲存的例子:

 基於Hadoop系統行儲存結構的優點在於快速資料載入和動態負載的高適應能力,這是因為行儲存保證了相同記錄的所有域都在同一個叢集節點,即同一個 HDFS塊。不過,行儲存的缺點也是顯而易見的,例如它不能支援快速查詢處理,因為當查詢僅僅針對多列表中的少數幾列時,它不能跳過不必要的列讀取;此 外,由於混合著不同資料值的列,行儲存不易獲得一個極高的壓縮比,即空間利用率不易大幅提高。

列儲存

HDFS塊內列儲存的例子

 在HDFS上按照列組儲存表格的例子。在這個例子中,列A和列B儲存在同一列組,而列C和列D分別儲存在單獨的列組。查詢時列儲存能夠避免讀不必要的列, 並且壓縮一個列中的相似資料能夠達到較高的壓縮比。然而,由於元組重構的較高開銷,它並不能提供基於Hadoop系統的快速查詢處理。列儲存不能保證同一 記錄的所有域都儲存在同一叢集節點,行儲存的例子中,記錄的4個域儲存在位於不同節點的3個HDFS塊中。因此,記錄的重構將導致通過叢集節點網路的大 量資料傳輸。儘管預先分組後,多個列在一起能夠減少開銷,但是對於高度動態的負載模式,它並不具備很好的適應性。

RCFile結合行儲存查詢的快速和列儲存節省空間的特點:首先,RCFile保證同一行的資料位於同一節點,因此元組重構的開銷很低;其次,像列儲存一樣,RCFile能夠利用列維度的資料壓縮,並且能跳過不必要的列讀取。

HDFS塊內RCFile方式儲存的例子:


 
 資料測試