Hive RCFile檔案儲存格式

2021-07-13 02:00:27 字數 2212 閱讀 6784

在新建hive表時,可以使用stored as rcfile來指定hive檔案的儲存方式為rcfile。

下圖是乙個rcfile的檔案結構形式。

從上圖可以看出:

1)一張表可以包含多個hdfs block。

2)在每個block中,rcfile以行組(row group,類似於orc中的stripe)為單位儲存其中的資料。所謂行組是指在關係型資料塊中,若干條記錄組成的乙個group。對於一張表來說,row group的大小是固定的。通過hdfs的block大小和row group的大小,能夠確定乙個block上可以容納多少個row group。

3)row group又由三個部分組成,包括乙個用於在block中分隔兩個row group的16位元組的標誌區,乙個儲存row group元資料資訊的header,以及實際資料區。表中的實際資料以列為單位進行儲存。

在儲存rcfile時,會對每個row group的metadata header區和data區進行壓縮。

在metadata header區中,記錄了該row group中有多少記錄,每個column總共有多少位元組數,以及每個column中每乙個field的位元組數等資訊。對metadata header區,使用rle(run length encoding)演算法來壓縮資料。需要讀取指定column的記錄時,可以根據這個metadata中記錄的位元組數等資訊,很快定位到對應的資料。

對data區的資料壓縮時,rcfile檔案格式並不會將整個區域一起進行壓縮,而是以列為單位進行gzip壓縮,這樣的處理方式使得需要讀取某些指定列的資料時,其他無關的列不需要進行讀取。

由於目前hdfs只支援在檔案末尾追加內容,無法隨意修改hdfs檔案中的資料。所以在使用rcfile檔案的hive表中也只能在檔案末尾寫入新的記錄。在向rcfile寫入資料時,

(1)為了避免頻繁的寫入操作,rcfile會為每乙個column在記憶體中維持乙個對應的column holder。當有記錄插入到hive表中時,會把這一條記錄的每個字段拆散存入到對應的column holder的末尾。伴隨著這個操作的同時,會在metadata header中記錄此次操作的相關資訊。

(2)上面的column holder當然是不能無限大的,為此rcfile設定了兩個引數,當滿足任何乙個時,就會把column holder中的資料flush到磁碟上。這兩個引數乙個是寫入記錄數,另乙個是column holder使用的記憶體大小。

(3)記錄寫入完畢後,rcfile首先會將metadata header進行壓縮。然後把每乙個column單獨進行壓縮,最後將壓縮好的資料flush到同乙個row group中。

當需要從乙個row group讀取資料時,rcfile並不會將整個row group中的資料都讀入到記憶體中,需要讀入的資料只包括metadata header,以及在語句中指定的那些column。

這兩部分資料讀入到記憶體中後,首先會將metadata header進行解壓縮,並一直儲存在記憶體中。接下來對載入到記憶體中的column資料,在rcfile中有乙個lazy decompression的概念,這個的意思是說,column資料並不會在載入到記憶體中後馬上進行解壓縮,而是後續處理中的確需要讀取這個column資料時解壓縮過程才會執行。比如有乙個sql語句,select a,b,c from table where a > 5;首先會對字段a解壓縮,如果判斷所有記錄中沒有a > 5的記錄,那麼欄位b和字段c都不必要進行解壓縮了。

引數預設值

描述hive.io.rcfile.record.buffer.size

4194304

設定row group的大小

hive.io.rcfile.record.interval

2147483647

row group中最大記錄數

row group預設大小為4mb主要是因為row group不能太大,也不能太小。在gzip壓縮演算法中,增大row group的大小能夠提公升壓縮的效能。但是當row group的大小達到某個閾值時,繼續增大row group並不能帶來壓縮效能的提公升。並且,以上面的sql語句為例如果乙個row group越大,其中儲存的記錄也就越多,這樣該row group中出現a >5的記錄的概率就越大,那麼就越難使用到lazy decompression這一特性帶來的效能提公升。並且row group越大,消耗的記憶體也就越多。

這個大小限制在orc檔案格式中得到了改善。

PHP ImageLoadFont用檔案格式轉換

根據imageloadfont官方說明需要使用到gdf檔案格式,依賴它的imagefontwidth和imagefontheight函式同樣需要。gdf檔案很難找,我收集了2種解決方案。windows平台下ttf轉gdf工具wftopf.exe 0積分 無毒 可在win10下執行 使用簡介如下 軟體...

Matlab儲存uint16格式檔案的相關注意事項

在matlab中,我們常使用imshow 函式來顯示影象,而此時的影象矩陣可能經過了某種運算。在matlab中,為了保證精度,經過了運算的影象矩陣i其資料型別會從unit8型變成double型。如果直接執行imshow i 我們會發現顯示的是乙個白色的影象。這是因為imshow 顯示影象時對doub...

FieldGroup繫結的日期型別儲存格式的問題

日期儲存的時候,當前資料庫中儲存格式為 2017 9 5 0 00 00 而我實現了以後,看到資料庫的儲存格式為 mon sep 04 00 00 00 cst 2017 原因找了很久,是在為fieldgroup 新增propertysetitem 時的問題 第一種儲存方式的實現為 property...