【hive中的file_format】
- SEQUENCEFILE:生產中絕對不會用,k-v格式,比源文本格式占用磁盤更多
- TEXTFILE:生產中用的多,行式存儲
- RCFILE:生產中用的少,行列混合存儲,OCR是他得升級版
- ORC:生產中最常用,列式存儲
- PARQUET:生產中最常用,列式存儲
- AVRO:生產中幾乎不用,不用考慮
- JSONFILE:生產中幾乎不用,不用考慮
- INPUTFORMAT:生產中幾乎不用,不用考慮
【注意】hive默認的文件格式是TextFile,可通過set hive.default.fileformat 進行配置
【行式存儲與列式存儲】
-
行式存儲與列式存儲數據物理底層存儲區別
【結論:由上圖可知】
- 行式存儲一定會把同一行數據存到同一個塊中,在select查詢的時候,是對所有字段的查詢,不可以單獨查詢某一行
- 列式存儲同一列數據一定是存儲到同一個塊中,換句話說就是不同的列可以放到不同塊中,在進行select查詢的時候可以單獨查詢某一列。
【優缺點】
-
列式存儲
- 優點:當查詢某個或者某幾個字段的時候,只需要查看存儲這幾個字段的這幾個block就可以了,大大的減少了數據的查詢范圍,提高了查詢效率
- 缺點:當進行全字段查詢的時候,數據需要重組,比單獨查一行要慢
-
行式存儲
- 優點:全字段查詢比較快
- 缺點:當查詢一張表里的幾個字段的時候,底層依舊是讀取所有的字段,這樣查詢效率降低,並且會造成不必要的資源浪費,而且,生產中很少會出現需要全字段查詢的場景
【hive文件格式配置實現以及對比】
- 創建原始表默認TEXTFILE
- CREATE EXTERNAL TABLE g6_access (
- cdn string,
- region string,
- level string,
- time string,
- ip string,
- domain string,
- url string,
- traffic bigint)
- ROW FORMAT DELIMITED
- FIELDS TERMINATED BY '\t'
- LOCATION '/g6/hadoop/access/clear/test/';
- 導入測試數據
- [hadoop@hadoop001 data]$ ll
- -rw-r--r-- 1 hadoop hadoop 68051224 Apr 17 17:37 part-r-00000
- [hadoop@hadoop001 data]$ hadoop fs -put part-r-00000 /g6/hadoop/access/clear/test/
- 通過hue查看數據的大小 64.9MB
- 創建以 SEQUENCEFILE格式儲存的表g6_access_seq,並使用g6_access中的數據
- create table g6_access_seq
- stored as SEQUENCEFILE
- as select * from g6_access ;
- 查看數據大小 71.8MB
- 結論:比默認的TEXTFILE格式的文件還要大,生產上基本上是不會用的
- 創建RCFILE數據存儲格式表,,並使用g6_access中的數據
- create table g6_access_rc
- stored as RCFILE
- as select * from g6_access;
- 查看數據大小 61.6MB
- 結論:存儲減少了3M左右,微不足道,讀寫性能也沒有什么優勢,生產也沒有用他的理由
- 創建ORCFILE數據存儲格式表,,並使用g6_access中的數據,默認是使用zlib壓縮,支持zlib和snappy
- create table g6_access_orc
- stored as ORC
- as select * from g6_access;
- 查看數據大小 17.0MB
- 創建ORCFILE數據存儲格式表,並使用g6_access中的數據
- create table g6_access_orc_none
- stored as ORC tblproperties ("orc.compress"="NONE")
- as select * from g6_access;
- 查看數據大小 51.5MB
- 創建PARQUET數據存儲格式表,不使用壓縮,並使用g6_access中的數據
- create table g6_access_par
- stored as PARQUET
- as select * from g6_access;
- 結論:ORC文件不壓縮,比源文件少了10多MB,ORC文件采用默認壓縮,文件只有源文件的四分之一
- 查看數據大小 58.3MB
- 創建PARQUET數據存儲格式表,設置使用gzip壓縮格式,並使用g6_access中的數據
- set parquet.compression=gzip;
- create table g6_access_par_zip
- stored as PARQUET
- as select * from g6_access;
- 結論:parquet格式文件大小是源文件的1/4左右。生產上也是好的選擇
【讀取數據量對比】
- 直接執行 select 查詢,觀察日志 尾部HDFS Read: 190XXX ,就可知道讀取數據量了