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