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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM