1. 程式人生 > 實用技巧 >儲存格式:parquet和orc對比

儲存格式:parquet和orc對比

Orc格式

Orc (Optimized Row Columnar)是Hive 0.11版裡引入的新的儲存格式。

如下圖所示可以看到每個Orc檔案由1個或多個stripe組成,每個stripe一般為HDFS的塊大小,每一個stripe包含多條記錄,這些記錄按照列進行獨立儲存,對應到Parquet中的row group的概念。每個Stripe裡有三部分組成,分別是Index Data,Row Data,Stripe Footer:

https://images2017.cnblogs.com/blog/400827/201710/400827-20171016172358709-873727711.jpg

1)Index Data:一個輕量級的index,預設是每隔1W行做一個索引。這裡做的索引應該只是記錄某行的各欄位在Row Data中的offset。

2Row Data

:存的是具體的資料,先取部分行,然後對這些行按列進行儲存對每個列進行了編碼,分成多個Stream來儲存

3)Stripe Footer:存的是各個Stream的型別,長度等資訊。

每個檔案有一個File Footer,這裡面存的是每個Stripe的行數,每個Column的資料型別資訊等;每個檔案的尾部是一個PostScript,這裡面記錄了整個檔案的壓縮型別以及FileFooter的長度資訊等。在讀取檔案時,會seek到檔案尾部讀PostScript,從裡面解析到File Footer長度,再讀FileFooter,從裡面解析到各個Stripe資訊,再讀各個Stripe,即從後往前讀。

Parquet格式

Parquet檔案是以二進位制方式儲存的,所以是不可以直接讀取的,檔案中包括該檔案的資料和元資料,因此Parquet格式檔案是自解析的。

1)行組(Row Group):每一個行組包含一定的行數,在一個HDFS檔案中至少儲存一個行組,類似於orcstripe的概念。

2)列塊(Column Chunk):在一個行組中每一列儲存在一個列塊中,行組中的所有列連續的儲存在這個行組檔案中。一個列塊中的值都是相同型別的,不同的列塊可能使用不同的演算法進行壓縮。

3)頁(Page):每一個列塊劃分為多個頁,一個頁是最小的編碼的單位,在同一個列塊的不同頁可能使用不同的編碼方式。

通常情況下,在儲存Parquet資料的時候會按照Block大小設定行組的大小,由於一般情況下每一個Mapper任務處理資料的最小單位是一個Block,這樣可以把每一個行組由一個

Mapper任務處理,增大任務執行並行度。Parquet檔案的格式。

上圖展示了一個Parquet檔案的內容,一個檔案中可以儲存多個行組,檔案的首位都是該檔案的Magic Code,用於校驗它是否是一個Parquet檔案,Footer length記錄了檔案元資料的大小,通過該值和檔案長度可以計算出元資料的偏移量,檔案的元資料中包括每一個行組的元資料資訊和該檔案儲存資料的Schema資訊。除了檔案中每一個行組的元資料,每一頁的開始都會儲存該頁的元資料,在Parquet中,有三種類型的頁:資料頁、字典頁和索引頁。資料頁用於儲存當前行組中該列的值,字典頁儲存該列值的編碼字典,每一個列塊中最多包含一個字典頁,索引頁用來儲存當前行組下該列的索引,目前Parquet中還不支援索引頁。

儲存檔案的壓縮比總結:ORC > Parquet

儲存檔案的查詢速度總結:查詢速度相近

原始碼都是用java寫的,有空可以看看