列式存儲格式 Apache ORC

Apache ORC 文件格式是一種Hadoop生態圈中的列式存儲格式,它的產生早在2013年初,最初產生自Apache Hive,用於降低Hadoop數據存儲空間和加速Hive查詢速度。

ORC(OptimizedRC File)存儲源自於RC(RecordColumnar File)這種存儲格式,RC是一種列式存儲引擎,對schema演化(修改schema需要重新生成數據)支持較差,而ORC是對RC改進,但它仍對schema演化支持較差,主要是在壓縮編碼,查詢性能方面做了優化。RC/ORC最初是在Hive中得到使用,最後發展勢頭不錯,獨立成一個單獨的項目。Hive 1.x版本對事務和update操作的支持,便是基於ORC實現的(其他存儲格式暫不支持)。ORC發展到今天,已經具備一些非常高級的feature,比如支持update操作,支持ACID,支持struct,array複雜類型。你可以使用複雜類型構建一個類似於parquet的嵌套式數據架構,但當層數非常多時,寫起來非常麻煩和複雜,而parquet提供的schema表達方式更容易表示出多級嵌套的數據類型。

ORC原生是不支持嵌套數據格式的,而是通過對複雜數據類型特殊處理的方式實現嵌套格式的支持,例如對於如下的hive表:

CREATE TABLE `orcStructTable`(
`name` string,
`course` struct,
`score` map,
`work_locations` array)

ORC格式會將其轉換成如下的樹狀結構(ORC的schema結構):

列式存儲格式 Apache ORC

在ORC的結構中這個schema包含10個column,其中包含了複雜類型列和原始類型的列,前者包括LIST、STRUCT、MAP和UNION類型,後者包括BOOLEAN、整數、浮點數、字符串類型等,其中STRUCT的孩子節點包括它的成員變量,可能有多個孩子節點,MAP有兩個孩子節點,分別為key和value,LIST包含一個孩子節點,類型為該LIST的成員類型,UNION一般不怎麼用得到。每一個Schema樹的根節點為一個Struct類型,所有的column按照樹的中序遍歷順序編號。

ORC只需要存儲schema樹中葉子節點的值,而中間的非葉子節點只是做一層代理,它們只需要負責孩子節點值得讀取,只有真正的葉子節點才會讀取數據,然後交由父節點封裝成對應的數據結構返回。

文件結構

ORC 文件是以二進制方式存儲的,所以是不可以直接讀取,ORC文件也是自解析的,它包含許多的元數據,這些元數據都是同構ProtoBuffer進行序列化的。ORC的文件結構入圖6,其中涉及到如下的概念:

  • ORC文件:保存在文件系統上的普通二進制文件,一個ORC文件中可以包含多個stripe,每一個stripe包含多條記錄,這些記錄按照列進行獨立存儲,對應到Parquet中的row group的概念。
  • 文件級元數據:包括文件的描述信息PostScript、文件meta信息(包括整個文件的統計信息)、所有stripe的信息和文件schema信息。
  • stripe:一組行形成一個stripe,每次讀取文件是以行組為單位的,一般為HDFS的塊大小,保存了每一列的索引和數據。
  • stripe元數據:保存stripe的位置、每一個列的在該stripe的統計信息以及所有的stream類型和位置。
  • row group:索引的最小單位,一個stripe中包含多個row group,默認為10000個值組成。
  • stream:一個stream表示文件中一段有效的數據,包括索引和數據兩類。索引stream保存每一個row group的位置和統計信息,數據stream包括多種類型的數據,具體需要哪幾種是由該列類型和編碼方式決定。
列式存儲格式 Apache ORC

ORC文件結構

在ORC文件中保存了三個層級的統計信息,分別為文件級別、stripe級別和row group級別的,他們都可以用來根據Search ARGuments(謂詞下推條件)判斷是否可以跳過某些數據,在統計信息中都包含成員數和是否有null值,並且對於不同類型的數據設置一些特定的統計信息。


分享到:


相關文章: