HIVE的幾種文件格式
1、TEXTFILE
文本格式,默認格式,數據不做壓縮,磁盤開銷大,數據解析開銷大
對應hive API為org.apache.hadoop.mapred.TextInputFormat和org.apache.hive.ql.io.HiveIgnoreKeyTextOutputFormat
可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分,從而無法對數據進行並行操作。
2、SequenceFile
hadoop提供的二進制文件格式,hadoop支持的標准文件格式
直接序列化到文件中,sequencefile文件不能直接查看,可以通過Hadoop fs -text查看
具有使用方便,可分割、可壓縮,可進行切片。壓縮支持NONE,RECORD,BLOCK(優先),可進行切片
對應hive API為:
org.apache.hadoop.mapred.SequenceFileInputFormat和org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
3、rcfile
大多數hadoop和hive存儲是行式存儲,在大多數環境下比較高效,因為大多數表具有的字段數不大,且文件按塊壓縮對於需要處理重復數據的情況比較高效,同時處理和調試工具(more、head、awk)都能很好的適應行式存儲的數據。
但當需要操作的表有成百上千個字段,而操作只有一小部分字段時,往往造成很大的浪費,此時若采用列存儲只操作需要的列便可大大提高性能
rcfile是一種行列存儲相結合的存儲方式,先將數據按行進行分塊再按列式存儲,保證同一條記錄在一個塊上,避免讀取多個塊,有利於數據壓縮和快速進行列存儲。
對應的hive API為org.apache.hadoop.hive.ql.io.RCFileInputFormat和org.apache.hadoop.hive.ql.io.RCFileOutputFormat
行存儲
基於Hadoop系統行存儲結構的有點是快速數據加載和動態負載的高適應能力,這是因為行存儲保證了相同的數據域都在同一個集群節點,即同一個HDFS塊。不過,行存儲的缺點也是顯而易見的,他不能支持快速查詢處理,因為當查詢僅針對多列表中的少數幾列時,他不能跳過不必要的列讀取;此外由於混合着不同數據值的列,行存儲不易獲得極高的壓縮比,即空間利用率不易大幅提高。盡管通過熵解碼和利用列相關性能夠獲得較好的壓縮比,但是復雜數據存儲實現會導致解壓開銷增大。
列式存儲
列式存儲和行式存儲相比有哪些優勢呢?
可以跳過不符合條件的數據,只讀取需要的數據,降低IO數據量。
壓縮編碼可以降低磁盤存儲空間。由於同一列的數據類型是一樣的,可以使用更高效的壓縮編碼(例如Run Length Encoding和Delta Encoding)進一步節約存儲空間。
只讀取需要的列,支持向量運算,能夠獲取更好的掃描性能。
4、orcfile
orcfile是對rcfile的優化,可以提高hive的讀寫、數據處理性能,提供更高的壓縮效率。
優點:
每個task只輸出單個文件,減少namenode負載
支持各種復雜的數據類型,比如datetime,decimal以及復雜類型(struct,list,map,union)
文件中存儲了一些輕量級的索引數據
基於數據類型的塊模式壓縮:integer類型的列用行程長度編碼,String類型的列使用字典編碼
用多個互相獨立的recordReaders並行讀相同的文件
無需掃描markers即可分割文件
綁定讀寫所需內存
metadata存儲用protocol buffers,支持添加和刪除列
5、自定義格式
若當前數據文件格式不能被當前hive所識別時,可以自定義文件格式,
用戶可通過實現InputFormat和OutputFormat來自定義輸入輸出格式。
總結
textfile 存儲空間消耗比較大,並且壓縮的text 無法分割和合並 查詢的效率最低,可以直接存儲,加載數據的速度最高
sequencefile 存儲空間消耗最大,壓縮的文件可以分割和合並 查詢效率高,需要通過text文件轉化來加載
orcfile, rcfile存儲空間最小,查詢的效率最高 ,需要通過text文件轉化來加載,加載的速度最低.
orcfile, rcfile較有優勢,orcfile,rcfile具備相當於行存儲的數據加載和負載適應能力,掃描表時避免不必要的列讀取,
擁有比其他結構更好的性能,而使用列維度的壓縮,能有效提升存儲空間利用率。
但orcfile, rcfile數據加載是性能損失較大,但由於hdfs一次寫入多次讀寫,所以損失可以接受。
SequenceFile,ORCFile(ORC),rcfile格式的表不能直接從本地文件導入數據,數據要先導入到textfile格式的表中,
然后再從textfile表中導入到SequenceFile,ORCFile(ORC),rcfile表中。
壓縮格式
參考文檔:文件格式 http://www.2cto.com/database/201605/506775.html
文件格式與壓縮: http://blog.csdn.net/houzhizhen/article/details/53097106