1. 程式人生 > >hive表的原始檔儲存格式

hive表的原始檔儲存格式

Hive檔案儲存格式
1.textfile
textfile為預設格式
儲存方式:行儲存
磁碟開銷大 資料解析開銷大,壓縮的text檔案 hive無法進行合併和拆分
(建表時不指定它會預設為這個格式,匯入資料時會直接把資料檔案拷貝到HDFS上不進行處理,原始檔可以直接通過hadoop fs -cat 檢視。)

2.sequencefile
二進位制檔案,以<key,value>的形式序列化到檔案中
儲存方式:行儲存,可分割 壓縮,一般選擇block壓縮
優勢是檔案和Hadoop api中的mapfile是相互相容的。

(sequencefile這是一種Hadoop API提供的二進位制的檔案使用方便)
3.rcfile
儲存方式:資料按行分塊 每塊按照列儲存
壓縮快 快速列存取,讀記錄儘量涉及到的block最少,讀取需要的列只需要讀取每個row group 的頭部定義。讀取全量資料的操作 效能可能比sequencefile沒有明顯的優勢

(rcfile儲存資料首先將其資料按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block,其次塊資料列式儲存有利於資料壓縮和快速的列存取,理論上具有高查詢效率)

4.orc

儲存方式:資料按行分塊 每塊按照列儲存,壓縮快 快速列存取,效率比rcfile高,是rcfile的改良版本

5.自定義格
使用者可以通過實現inputformat和 outputformat來自定義輸入輸出格式。

Apache Parquet
源自於google Dremel系統(可下載論文參閱),Parquet相當於Google Dremel中的資料儲存引擎,而Apache頂級開源專案Drill正是Dremel的開源實現。
Apache Parquet 最初的設計動機是儲存巢狀式資料,比如Protocolbuffer,thrift,json等,將這類資料儲存成列式格式,以方便對其高效壓縮和編碼,且使用更少的IO操作取出需要的資料,這也是Parquet相比於ORC的優勢,它能夠透明地將Protobuf和thrift型別的資料進行列式儲存,在Protobuf和thrift被廣泛使用的今天,與parquet進行整合,是一件非容易和自然的事情。 除了上述優勢外,相比於ORC, Parquet沒有太多其他可圈可點的地方,比如它不支援update操作(資料寫成後不可修改),不支援ACID等。

Apache ORC
ORC(OptimizedRC File)儲存源自於RC(RecordColumnar File)這種儲存格式,RC是一種列式儲存引擎,對schema演化(修改schema需要重新生成資料)支援較差,而ORC是對RC改進,但它仍對schema演化支援較差,主要是在壓縮編碼,查詢效能方面做了優化。RC/ORC最初是在Hive中得到使用,最後發展勢頭不錯,獨立成一個單獨的專案。Hive 1.x版本對事務和update操作的支援,便是基於ORC實現的(其他儲存格式暫不支援)。ORC發展到今天,已經具備一些非常高階的feature,比如支援update操作,支援ACID,支援struct,array複雜型別。你可以使用複雜型別構建一個類似於parquet的巢狀式資料架構,但當層數非常多時,寫起來非常麻煩和複雜,而parquet提供的schema表達方式更容易表示出多級巢狀的資料型別。


總結:
textfile 儲存空間消耗比較大,並且壓縮的text 無法分割和合並 查詢的效率最低,可以直接儲存,載入資料的速度最高
sequencefile 儲存空間消耗最大,壓縮的檔案可以分割和合並 查詢效率高,需要通過text檔案轉化來載入
rcfile 儲存空間最小,查詢的效率最高 ,需要通過text檔案轉化來載入,載入的速度最低

相比傳統的行式儲存引擎,列式儲存引擎具有更高的壓縮比,更少的IO操作而備受青睞(注:列式儲存不是萬能高效的,很多場景下行式儲存仍更加高效),尤其是在資料列(column)數很多,但每次操作僅針對若干列的情景,列式儲存引擎的價效比更高。

在網際網路大資料應用場景下,大部分情況下,資料量很大且資料欄位數目很多,但每次查詢資料只針對其中的少數幾行,這時候列式儲存是極佳的選擇