hive檔案儲存格式
Hive支援的儲存資料的格式主要有:TEXTFILE(行儲存) 、SEQUENCEFILE(行式)、ORC(hive)、PARQUET(spark)。
1.行儲存的特點
查詢滿足條件的一整行資料的時候,列儲存則需要去每個聚集的欄位找到對應的每個列的值,行儲存只需要找到其中一個值,其餘的值都在相鄰地方,所以此時行儲存查詢的速度更快。
2.列儲存的特點
因為每個欄位的資料聚集儲存,在查詢只需要少數幾個欄位的時候,能大大減少讀取的資料量;每個欄位的資料型別一定是相同的,列式儲存可以針對性的設計更好的設計壓縮演算法。
TEXTFILE和SEQUENCEFILE的儲存格式都是基於行儲存的;
ORC和PARQUET是基於列式儲存的。
TextFile格式
預設格式,資料不做壓縮,磁碟開銷大,資料解析開銷大。可結合Gzip、Bzip2使用,但使用Gzip這種方式,hive不會對資料進行切分,從而無法對資料進行並行操作。
Orc格式
Orc (Optimized Row Columnar)是Hive 0.11版裡引入的新的儲存格式。
如圖6-11所示可以看到每個Orc檔案由1個或多個stripe組成,每個stripe一般為HDFS的塊大小,每一個stripe包含多條記錄,這些記錄按照列進行獨立儲存,對應到Parquet中的row group的概念。每個Stripe裡有三部分組成,分別是Index Data,Row Data,Stripe Footer:
Orc格式
1)Index Data:一個輕量級的index,預設是每隔1W行做一個索引。這裡做的索引應該只是記錄某行的各欄位在Row Data中的offset。
2)Row Data:存的是具體的資料,先取部分行,然後對這些行按列進行儲存。對每個列進行了編碼,分成多個Stream來儲存。
3)Stripe Footer:存的是各個Stream的型別,長度等資訊。
每個檔案有一個File Footer,這裡面存的是每個Stripe的行數,每個Column的資料型別資訊等;每個檔案的尾部是一個PostScript,這裡面記錄了整個檔案的壓縮型別以及FileFooter的長度資訊等。在讀取檔案時,會seek到檔案尾部讀PostScript,從裡面解析到File Footer長度,再讀FileFooter,從裡面解析到各個Stripe資訊,再讀各個Stripe,即從後往前讀。
Parquet格式
Parquet檔案是以二進位制方式儲存的,所以是不可以直接讀取的,檔案中包括該檔案的資料和後設資料,因此Parquet格式檔案是自解析的。
-
- 行組(Row Group):每一個行組包含一定的行數,在一個HDFS檔案中至少儲存一個行組,類似於orc的stripe的概念。
-
- 列塊(Column Chunk):在一個行組中每一列儲存在一個列塊中,行組中的所有列連續的儲存在這個行組檔案中。一個列塊中的值都是相同型別的,不同的列塊可能使用不同的演算法進行壓縮。
-
- 頁(Page):每一個列塊劃分為多個頁,一個頁是最小的編碼的單位,在同一個列塊的不同頁可能使用不同的編碼方式。
通常情況下,在儲存Parquet資料的時候會按照Block大小設定行組的大小,由於一般情況下每一個Mapper任務處理資料的最小單位是一個Block,這樣可以把每一個行組由一個Mapper任務處理,增大任務執行並行度。Parquet檔案的格式如圖6-12所示。
- 頁(Page):每一個列塊劃分為多個頁,一個頁是最小的編碼的單位,在同一個列塊的不同頁可能使用不同的編碼方式。
上圖展示了一個Parquet檔案的內容,一個檔案中可以儲存多個行組,檔案的首位都是該檔案的Magic Code,用於校驗它是否是一個Parquet檔案,Footer length記錄了檔案後設資料的大小,通過該值和檔案長度可以計算出後設資料的偏移量,檔案的後設資料中包括每一個行組的後設資料資訊和該檔案儲存資料的Schema資訊。除了檔案中每一個行組的後設資料,每一頁的開始都會儲存該頁的後設資料,在Parquet中,有三種型別的頁:資料頁、字典頁和索引頁。資料頁用於儲存當前行組中該列的值,字典頁儲存該列值的編碼字典,每一個列塊中最多包含一個字典頁,索引頁用來儲存當前行組下該列的索引,目前Parquet中還不支援索引頁。
主流檔案儲存格式對比實驗
從儲存檔案的壓縮比和查詢速度兩個角度對比。
儲存檔案的壓縮比測試:
-
- 測試資料
2.TextFile
(1)建立表,儲存資料格式為TEXTFILE
create table log_text (
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by ‘\t’
stored as textfile ;
(2)向表中載入資料
hive (default)> load data local inpath ‘/opt/module/datas/log.data’ into table log_text ;
(3)檢視錶中資料大小
hive (default)> dfs -du -h /user/hive/warehouse/log_text;
18.1 M /user/hive/warehouse/log_text/log.data
3.ORC
(1)建立表,儲存資料格式為ORC
create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by ‘\t’
stored as orc ;
(2)向表中載入資料
hive (default)> insert into table log_orc select * from log_text ;
(3)檢視錶中資料大小
hive (default)> dfs -du -h /user/hive/warehouse/log_orc/ ;
2.8 M /user/hive/warehouse/log_orc/000000_0
4.Parquet
(1)建立表,儲存資料格式為parquet
create table log_parquet(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by ‘\t’
stored as parquet ;
(2)向表中載入資料
hive (default)> insert into table log_parquet select * from log_text ;
(3)檢視錶中資料大小
hive (default)> dfs -du -h /user/hive/warehouse/log_parquet/ ;
13.1 M /user/hive/warehouse/log_parquet/000000_0
儲存檔案的壓縮比總結:
ORC > Parquet > textFile
儲存檔案的查詢速度測試:
1.TextFile
hive (default)> select count() from log_text;
_c0
100000
Time taken: 21.54 seconds, Fetched: 1 row(s)
Time taken: 21.08 seconds, Fetched: 1 row(s)
Time taken: 19.298 seconds, Fetched: 1 row(s)
2.ORC
hive (default)> select count() from log_orc;
_c0
100000
Time taken: 20.867 seconds, Fetched: 1 row(s)
Time taken: 22.667 seconds, Fetched: 1 row(s)
Time taken: 18.36 seconds, Fetched: 1 row(s)
3.Parquet
hive (default)> select count(*) from log_parquet;
_c0
100000
Time taken: 22.922 seconds, Fetched: 1 row(s)
Time taken: 21.074 seconds, Fetched: 1 row(s)
Time taken: 18.384 seconds, Fetched: 1 row(s)
儲存檔案的查詢速度總結:查詢速度相近。
相關文章
- Hive之儲存格式Hive
- hive從入門到放棄(六)——常用檔案儲存格式Hive
- 儲存系統實現-資料檔案格式
- 塊儲存 檔案儲存 物件儲存物件
- 檔案儲存
- 資料儲存--檔案儲存
- hive學習之四:hive檔案格式以及壓縮編碼Hive
- CSV檔案儲存
- Flutter持久化儲存之檔案儲存Flutter持久化
- T-SQL 儲存過程建立 PDF 格式檔案(報表)SQL儲存過程
- Hive之 資料儲存Hive
- Hbase儲存格式
- Android 檔案儲存Android
- 儲存檔案到本地
- InnoDB儲存引擎檔案儲存引擎
- 06、hdfs檔案儲存
- android: 檔案儲存Android
- 儲存json檔案JSON
- 物件儲存 vs 檔案儲存 vs 塊儲存,選哪個?物件
- RAC歸檔配置方案:使用NFS共享儲存儲存歸檔檔案NFS
- Redis儲存結構以及儲存格式Redis
- 掌握Hive資料儲存模型Hive模型
- IOS資料儲存之檔案沙盒儲存iOS
- 用於初始化Xilinx 儲存 IP核的COE檔案格式
- 企業檔案安全儲存
- IPFS的檔案儲存模式模式
- 修改並儲存hosts檔案
- CIFS檔案的儲存————SMB
- Android中的資料儲存之檔案儲存Android
- MyISAM表的儲存格式---行格式
- 好程式設計師大資料學習路線之hive儲存格式程式設計師大資料Hive
- Hive簡易教程 - 資料儲存Hive
- Eclipse 儲存檔案時自動格式化程式碼的設定Eclipse
- Matlab將.mat檔案儲存為.txt檔案Matlab
- 如何將MAC的檔案儲存至NAS網路儲存?Mac
- CEPH分散式儲存搭建(物件、塊、檔案三大儲存)分散式物件
- Android 檔案儲存淺析Android
- python 儲存檔案jsonPythonJSON