RCFile和ORCFile

1. RCFile

RCFile文件格式是FaceBook開源的一種Hive的文件存儲格式,首先將表分爲幾個行組,對每個行組內的數據進行按列存儲,每一列的數據都是分開存儲,正是先水平劃分,再垂直劃分的理念。

這裏寫圖片描述

在存儲結構上: 
如上圖是HDFS內RCFile的存儲結構,我們可以看到,首先對錶進行行劃分,分成多個行組。一個行組主要包括:16字節的HDFS同步塊信息,主要是爲了區分一個HDFS塊上的相鄰行組;元數據的頭部信息主要包括該行組內的存儲的行數、列的字段信息等等;數據部分我們可以看出RCFile將每一行,存儲爲一列,將一列存儲爲一行,因爲當表很大,我們的字段很多的時候,我們往往只需要取出固定的一列就可以。 
在一般的行存儲中 select a from table,雖然只是取出一個字段的值,但是還是會遍歷整個表,所以效果和select * from table 一樣,在RCFile中,像前面說的情況,只會讀取該行組的一行。 
在一般的列存儲中,會將不同的列分開存儲,這樣在查詢的時候會跳過某些列,但是有時候存在一個表的有些列不在同一個HDFS塊上(如下圖),所以在查詢的時候,hive重組列的過程會浪費很多IO開銷。

列存儲

而RCFile由於相同的列都是在一個HDFS塊上,所以相對列存儲而言會節省很多資源。

在存儲空間上: 
RCFile採用遊程編碼,相同的數據不會重複存儲,很大程度上節約了存儲空間,尤其是字段中包含大量重複數據的時候。

懶加載: 
數據存儲到表中都是壓縮的數據,Hive讀取數據的時候會對其進行解壓縮,但是會針對特定的查詢跳過不需要的列,這樣也就省去了無用的列解壓縮。

select c from table where a>1
  • 1
  • 1

針對行組來說,會對一個行組的a列進行解壓縮,如果當前列中有a>1的值,然後纔去解壓縮c。若當前行組中不存在a>1的列,那就不用解壓縮c,從而跳過整個行組。

2.ORCFile

ORC是在一定程度上擴展了RCFile,是對RCFile的優化。 
ORCFile Format

存儲結構上 
根據結構圖,我們可以看到ORCFile在RCFile基礎上引申出來Stripe和Footer等。每個ORC文件首先會被橫向切分成多個Stripe,而每個Stripe內部以列存儲,所有的列存儲在一個文件中,而且每個stripe默認的大小是250MB,相對於RCFile默認的行組大小是4MB,所以比RCFile更高效。

Postscripts中存儲該表的行數,壓縮參數,壓縮大小,列等信息
Stripe Footer中包含該stripe的統計結果,包括Max,Min,count等信息
FileFooter中包含該表的統計結果,以及各個Stripe的位置信息
IndexData中保存了該stripe上數據的位置信息,總行數等信息
RowData以stream的形式保存了數據的具體信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

Hive讀取數據的時候,根據FileFooter讀出Stripe的信息,根據IndexData讀出數據的偏移量從而讀取出數據。 
網友有一幅圖,形象的說明了這個問題: 
這裏寫圖片描述

存儲空間上 
ORCFile擴展了RCFile的壓縮,除了Run-length(遊程編碼),引入了字典編碼和Bit編碼。 
採用字典編碼,最後存儲的數據便是 
字典中的值,每個字典值得長度以及字段在字典中的位置

至於Bit編碼,對所有字段都可採用Bit編碼來判斷該列是否爲null, 
如果爲null則Bit值存爲0,否則存爲1,對於爲null的字段在實際編碼的時候不需要存儲,也就是說字段若爲null,是不佔用存儲空間的。

發佈了207 篇原創文章 · 獲贊 67 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章