前言
Hive支持的存儲數的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET。
行與列存儲的特點
行存儲的特點
查詢滿足條件的一整行數據的時候,列存儲則需要去每個聚集的字段找到對應的每個列的值,行存儲只需要找到其中一個值,其余的值都在相鄰地方,所以此時行存儲查詢的速度更快。
列存儲的特點
因為每個字段的數據聚集存儲,在查詢只需要少數幾個字段的時候,能大大減少讀取的數據量;每個字段的數據類型一定是相同的,列式存儲可以針對性的設計更好的設計壓縮算法。
Hive文件存儲格式以及優缺點
textfile
- 默認的文件格式,行存儲。建表時不指定存儲格式即為textfile,導入數據時把數據文件拷貝至hdfs不進行處理
- 優點:最簡單的數據格式,便於和其他工具(Pig, grep, sed, awk)共享數據,便於查看和編輯;加載較快
- 缺點:耗費存儲空間,I/O性能較低;Hive不進行數據切分合並,不能進行並行操作,查詢效率低
- 場景:適用於小型查詢,查看具體數據內容的測試操作
sequencefile
- 含有鍵值對的二進制文件,行存儲
- 優點:可壓縮、可分割,優化磁盤利用率和I/O;可並行操作數據,查詢效率高
- 缺點:存儲空間消耗最大;對於Hadoop生態系統之外的工具不適用,需要通過text文件轉化加載
- 場景:適用於數據量較小、大部分列的查詢
rcfile
- 存儲模式:按列存儲,采用行組模式對數據進行存儲(數據按行分塊,每塊按照列存儲)
- 存儲結構:包括(16字節的HDFS同步塊信息以及元數據的頭部信息主要包括該行組內的存儲的行數、列的字段信息)
- 存儲空間:采用游程編碼
- 優點:可壓縮,高效的列存取;查詢效率較高
- 缺點:加載時性能消耗較大,需要通過text文件轉化加載;讀取全量數據性能低
- 場景:多數用於存儲需要“長期留存”的數據文件
orcfile
- 存儲模式:按列存儲,所有列存在一個文件中,
- 每個ORC文件首先會被橫向切分成多個Stripe,而每個Stripe內部以列存儲,所有的列存儲在一個文件中,而且每個stripe默認的大小是250MB,相對於RCFile默認的行組大小是4MB,所以比RCFile更高效。Postscripts中存儲該表的行數,壓縮參數,壓縮大小,列等信息;Stripe Footer中包含該stripe的統計結果,包括Max,Min,count等信息;FileFooter中包含該表的統計結果,以及各個Stripe的位置信息;IndexData中保存了該stripe上數據的位置信息,總行數等信息;RowData以stream的形式保存了數據的具體信息
- 除了游程編碼,引入了字典編碼和Bit編碼
- 場景:適用於Hive中大型的存儲、查詢
parquet
- 存儲模式:按列存儲,Parquet文件是以二進制方式存儲的,不可以直接讀取和修改的,文件是自解析的,文件中包括該文件的數據和元數據
- 存儲結構:行組(Row Group):按照行將數據物理上划分為多個單元,每一個行組包含一定的行數,在一個HDFS文件中至少存儲一個行組,Parquet讀寫的時候會將整個行組緩存在內存中,所以如果每一個行組的大小是由內存大的小決定的