ORC 查询流程
ORC 文件格式
ORC 文件分成多個 Stripe,Stripe 里又分為多個 RowGroup,每個 RowGroup 包含文件中的所有列的一部分數據,每個 RowGroup 默認有 10000 行元組。查詢時只在 RowGroup 層做過濾,檢查各個列中是否可能存在結果。十分粗粒度,不能保證讀出來的每一行都滿足條件。
ORC 讀取流程
OrcFile.createReader() 時讀取文件的 Footer 和 Metadata 信息,記錄文件中的 Stripe,每個 Stripe 是包含所有列的一部分數據段。是 Orc 文件的最大的粒度。
-
創建一個 VectorizedRowBatch,這個東西主要負責存放查出來的數據。查詢的schema里有幾列,VectorizedRowBatch 中就有幾列,每一列是原始數據類型的數組,默認長度 1024。
-
創建 RecordReaderImpl 對象,用來讀數據,同時構造過濾器 SargApplier,創造 DataReader。
-
讀取第一行滿足要求的數據。RecordReaderImpl.advanceToNextRow(),讀第一個 Stripe
-
讀 Stripe 的流程: RecordReaderImpl.beginReadStripe()
- 讀 StripeInformation,包括 Stripe Footer
- 對 Stripe 內的每一個 RowGroup 進行過濾: RecordReaderImpl.pickRowGroups(),生成一個 includedRowGroups。根據這個東西構造出需要讀的數據的位置,并且把涉及到的數據的原始字節數組都讀出來。
-
填充 batch: TreeReaderFactory.nextBatch()
- 最后還是要根據讀出來的 RowGroup 填充 batch,batch是原始數據類型的數組,沒有封裝,很高效。
小坑
如果一個 batch 有兩列,第一列是遞增的1-100,第二列也是遞增的1-100,查詢過濾條件 第一列 < 50 and 第二列 > 60,這個 batch 也會讀出來。
總結
- 上一篇: 卧室床选什么颜色好
- 下一篇: 我的世界java版合成表_《我的世界》基