1. 程式人生 > >Parquet 寫資料過程及原始碼分析

Parquet 寫資料過程及原始碼分析

Parquet寫資料過程及原始碼分析

本文主要從parquet寫資料的角度進行分析,主要涉及parquet從拿到資料模型到最終將一條記錄經過計算、編碼、壓縮等過程寫入記憶體的過程(暫時沒有包括寫入檔案的過程,後續補充)。主要從以下幾個方面進行介紹:
  • 寫流程涉及的類
  • 寫資料的過程

先看看在這個過程中涉及的類及其作用

這裡介紹的類都是一些基類,具體的實現類大家可以去看裡面具體的實現類...

valueWriter: 這個類是一個父類,主要涉及相應的壓縮操作,算是在寫入檔案之前最後呼叫的類。這個類不需要知道自己的輸入具有什麼含義,只需要按照相應的規則對輸入的byte進行壓縮即可,然後將輸出結果儲存在自己維護的一個ByteArrayOutputStream裡面。

pageWriter: 從類名可以直接看出,這個類是將資料按照page進行組織的一個類。它本身不涉及任何編碼與壓縮操作,它的作用是與valueWriter相配合,當valueWriter中的資料量達到一定閾值的時候,系統會將其中的資料寫入到pageWriter中,具體後面會給出解析。

ColumnWriter: 這個類是對一列進行寫入操作的類,這個類包含一個pageWriter和三個valueWriter,三個valueWriter的作用分別是寫入Value、Repeation level 、Definition level,當valueWriter中的資料總量達到一定閾值的時候,ColumnWriter會將其中的資料打包(其實就是連線起來…)一起寫入到pageWriter中,相當於向pageWriter中添加了一個page,同時會將該page的header寫入page中,header是由columnWriter中的statistic變數維護的。

ColumnWriterStore: 不太清楚這個名字具體是怎麼起出來的,這個叫Store的類可以認為是一個對ColumnWriter的Map,裡面儲存了不同的ColumnWriter,可以這麼認為,ColumnWriterStore對應的是一個rowGroup,可以通過制定的ID獲取到相應列的ColumnWriter

pageWriterStore: 這個類的功能和ColumnWriterStore類似,它裡面儲存的是不同的pageWriter

ColumnIO: 可以認為這個類是一個管理器,它負通過給定的Schema構建資料模型,接收一條記錄,並將記錄交給ColumnWriter進行寫,它有一個內部類,叫做RecordConsumer

,這個類的作用在下面進行介紹。這個類還有一個重要的功能就是針對給定的資料模型,計算各個記錄的Definition Level 和 Repeation Level。是統籌資料寫入階段的一個管理器。

RecordConsumer: 這個類可能是作者想要滿足某些設計模式而實現的類。它在這裡起到了一個紐帶的作用,這個類會獲得ColumnWriterStore的引用,並且會被資料模型中的具體實現類(例如BinaryValue)引用,從而間接地寫資料(後面會降到該過程)

Group: Group在這裡更像是一條記錄,可以看做是一個Record的引用。

GroupWriter: GroupWriter的出現其實有些奇怪,在看了程式碼之後,發現它其實是為了更方面地寫一條記錄而加入得一個類,它具有一個 WriteGroup() 方法,我們知道在parquet中,一條記錄本質上是一個巢狀結構,WriteGroup 方法其實是遞迴地對一個Group中的每個欄位執行寫入操作,每個欄位是一個Primitive型別,該型別會呼叫自己的writeValue()方法,去呼叫RecordConsumer中的ColumnWriterStore中的ColumnWriter中的ValueWriter,哈哈~~,寫的有點繞,只是想表達一下這個呼叫結構。

下面看一下整個流程圖

Parquet寫過程流程圖

這裡的流程圖主要表達了資料在記憶體中的寫入過程,沒有涉及檔案的寫入。