Apache ORC列式存儲格式
Apache ORC 文件格式是一種Hadoop生態(tài)圈中的列式存儲格式,它的產(chǎn)生早在2013年初,最初產(chǎn)生自Apache Hive,用于降低Hadoop數(shù)據(jù)存儲空間和加速Hive查詢速度。
ORC(OptimizedRC File)存儲源自于RC(RecordColumnar File)這種存儲格式,RC是一種列式存儲引擎,對schema演化(修改schema需要重新生成數(shù)據(jù))支持較差,而ORC是對RC改進,但它仍對schema演化支持較差,主要是在壓縮編碼,查詢性能方面做了優(yōu)化。RC/ORC最初是在Hive中得到使用,最后發(fā)展勢頭不錯,獨立成一個單獨的項目。Hive 1.x版本對事務和update操作的支持,便是基于ORC實現(xiàn)的(其他存儲格式暫不支持)。ORC發(fā)展到今天,已經(jīng)具備一些非常高級的feature,比如支持update操作,支持ACID,支持struct,array復雜類型。你可以使用復雜類型構(gòu)建一個類似于parquet的嵌套式數(shù)據(jù)架構(gòu),但當層數(shù)非常多時,寫起來非常麻煩和復雜,而parquet提供的schema表達方式更容易表示出多級嵌套的數(shù)據(jù)類型。
ORC原生是不支持嵌套數(shù)據(jù)格式的,而是通過對復雜數(shù)據(jù)類型特殊處理的方式實現(xiàn)嵌套格式的支持,例如對于如下的hive表:
CREATE TABLE `orcStructTable`( `name` string, `course` struct<course:string,score:int>, `score` map<string,int>, `work_locations` array<string>)
ORC格式會將其轉(zhuǎn)換成如下的樹狀結(jié)構(gòu)(ORC的schema結(jié)構(gòu)):
在ORC的結(jié)構(gòu)中這個schema包含10個column,其中包含了復雜類型列和原始類型的列,前者包括LIST、STRUCT、MAP和UNION類型,后者包括BOOLEAN、整數(shù)、浮點數(shù)、字符串類型等,其中STRUCT的孩子節(jié)點包括它的成員變量,可能有多個孩子節(jié)點,MAP有兩個孩子節(jié)點,分別為key和value,LIST包含一個孩子節(jié)點,類型為該LIST的成員類型,UNION一般不怎么用得到。每一個Schema樹的根節(jié)點為一個Struct類型,所有的column按照樹的中序遍歷順序編號。
ORC只需要存儲schema樹中葉子節(jié)點的值,而中間的非葉子節(jié)點只是做一層代理,它們只需要負責孩子節(jié)點值得讀取,只有真正的葉子節(jié)點才會讀取數(shù)據(jù),然后交由父節(jié)點封裝成對應的數(shù)據(jù)結(jié)構(gòu)返回。
文件結(jié)構(gòu)
ORC 文件是以二進制方式存儲的,所以是不可以直接讀取,ORC文件也是自解析的,它包含許多的元數(shù)據(jù),這些元數(shù)據(jù)都是同構(gòu)ProtoBuffer進行序列化的。ORC的文件結(jié)構(gòu)入圖6,其中涉及到如下的概念:
ORC文件:保存在文件系統(tǒng)上的普通二進制文件,一個ORC文件中可以包含多個stripe,每一個stripe包含多條記錄,這些記錄按照列進行獨立存儲,對應到Parquet中的row group的概念。
文件級元數(shù)據(jù):包括文件的描述信息PostScript、文件meta信息(包括整個文件的統(tǒng)計信息)、所有stripe的信息和文件schema信息。
stripe:一組行形成一個stripe,每次讀取文件是以行組為單位的,一般為HDFS的塊大小,保存了每一列的索引和數(shù)據(jù)。
stripe元數(shù)據(jù):保存stripe的位置、每一個列的在該stripe的統(tǒng)計信息以及所有的stream類型和位置。
row group:索引的最小單位,一個stripe中包含多個row group,默認為10000個值組成。
stream:一個stream表示文件中一段有效的數(shù)據(jù),包括索引和數(shù)據(jù)兩類。索引stream保存每一個row group的位置和統(tǒng)計信息,數(shù)據(jù)stream包括多種類型的數(shù)據(jù),具體需要哪幾種是由該列類型和編碼方式?jīng)Q定。
在ORC文件中保存了三個層級的統(tǒng)計信息,分別為文件級別、stripe級別和row group級別的,他們都可以用來根據(jù)Search ARGuments(謂詞下推條件)判斷是否可以跳過某些數(shù)據(jù),在統(tǒng)計信息中都包含成員數(shù)和是否有null值,并且對于不同類型的數(shù)據(jù)設(shè)置一些特定的統(tǒng)計信息。
更詳細的介紹請看 http://blog.csdn.net/yu616568/article/details/51868447
