1. 程式人生 > >Hive之儲存格式

Hive之儲存格式

常用的儲存格式

1.textfile

Hive資料表的預設格式,資料不做壓縮,磁碟開銷大,資料解析開銷大。儲存方式:行儲存。

可以使用Gzip壓縮演算法,但壓縮後的檔案不支援split。

在反序列化過程中,必須逐個字元判斷是不是分隔符和行結束符,因此反序列化開銷會比SequenceFile高几十倍。

2.RCFile

儲存方式:資料按行分塊,每塊按列儲存。結合了行儲存和列儲存的優點:

首先,RCFile 保證同一行的資料位於同一節點,因此元組重構的開銷很低

其次,像列儲存一樣,RCFile 能夠利用列維度的資料壓縮,並且能跳過不必要的列讀取

資料追加:RCFile不支援任意方式的資料寫操作,僅提供一種追加介面,這是因為底層的 HDFS當前僅僅支援資料追加寫檔案尾部。

行組大小:行組變大有助於提高資料壓縮的效率,但是可能會損害資料的讀取效能,因為這樣增加了 Lazy 解壓效能的消耗。而且行組變大會佔用更多的記憶體,這會影響併發執行的其他MR作業。 考慮到儲存空間和查詢效率兩個方面,Facebook 選擇 4MB 作為預設的行組大小,當然也允許使用者自行選擇引數進行配置。

3.ORCFile

儲存方式:資料按行分塊,每塊按照列儲存。 

壓縮快,可切分,快速列存取。效率比rcfile高,是rcfile的改良版本。

支援各種複雜的資料型別,比如datetime,decimal,以及複雜的struct

4.Sequence Files

壓縮資料檔案可以節省磁碟空間,但Hadoop中有些原生壓縮檔案的缺點之一就是不支援分割。支援分割的檔案可以並行的有多個mapper程式處理大資料檔案,大多數檔案不支援可分割是因為這些檔案只能從頭開始讀。Sequence File是可分割的檔案格式,支援Hadoop的block級壓縮。

Hadoop API提供的一種二進位制檔案,以key-value的形式序列化到檔案中。儲存方式:行儲存。

sequencefile支援三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,RECORD是預設選項,通常BLOCK會帶來較RECORD更好的壓縮效能。

優勢是檔案和hadoop api中的MapFile是相互相容的

注:建表時預設為這個格式,匯入資料時會直接把資料檔案拷貝到hdfs上不進行處理。SequenceFile、RCFile、ORC格式的表不能直接從本地檔案匯入資料,資料要先匯入到TextFile格式的表中,然後再從TextFile表中用insert匯入到SequenceFile、RCFile表中。

列式儲存和行式儲存

首先我們看一下一張表的儲存格式

1.1 行式儲存

1.2 列式儲存

 

1.3列式儲存和行式儲存的比較

行式儲存

優點:

相關的資料是儲存在一起,比較符合面向物件的思維,因為一行資料就是一條記錄

這種儲存格式比較方便進行INSERT/UPDATE操作

缺點:

如果查詢只涉及某幾個列,它會把整行資料都讀取出來,不能跳過不必要的列讀取。當然資料比較少,一般沒啥問題,如果資料量比較大就比較影響效能

由於每一行中,列的資料型別不一致,導致不容易獲得一個極高的壓縮比,也就是空間利用率不高

不是所有的列都適合作為索引

列式儲存

優點:

查詢時,只有涉及到的列才會被查詢,不會把所有列都查詢出來,即可以跳過不必要的列查詢

高效的壓縮率,不僅節省儲存空間也節省計算記憶體和CPU

任何列都可以作為索引

缺點:

INSERT/UPDATE很麻煩或者不方便

不適合掃描小量的資料

檔案讀寫與序列化

記錄編碼由InputFormat控制

記錄解碼由SerDe控制,使用OutputFormat將查詢輸出

以及SerDe

Hive中,預設使用的是TextInputFormat,一行表示一條記錄。在每條記錄(一行中),預設使用^A分割各個欄位。

在有些時候,我們往往面對多行,結構化的文件,並需要將其匯入Hive處理,此時,就需要自定義InputFormat、OutputFormat,以及SerDe。

當hive讀取hdfs檔案時:

(1) 呼叫InputFormat,將檔案切成不同的文件。每篇文件即一行(Row)。

(2) 呼叫SerDe的Deserializer,將一行(Row),切分為各個欄位。

 

Stored as orc 和stored as INPUTFORMAT… OUTPUTFORMAT…的區別?

當我們使用Stored as orc的時候,其實隱式的指定了下面三個配置:

1 SERDE:org.apache.hadoop.hive.ql.io.orc.OrcSerde

2 INPUTFORMAT: org.apache.hadoop.hive.ql.io.orc.InputFormat

3 OUTPUTFORMAT: org.apache.hadoop.hive.ql.io.orc.OutputFormat

當我們顯式的指定stored as INPUTFORMAT… OUTPUTFORMAT…:

此時SERDE並沒有指定,使用的是預設的SERDE,或者配置檔案中的SERDE