掌握 Parquet 檔案:結構、應用場景與核心優勢

Parquet 檔案是以欄而非列來儲存資料。Apache Parquet 專案將其描述為「一種開源、欄導向的資料檔案格式,旨在實現高效的資料儲存與檢索」。正是這一個設計選擇,解釋了為什麼它體積更小、查詢更快,且難以透過按兩下直接開啟。
什麼是 Parquet 檔案?
Parquet 是一種用於表格資料的檔案格式,作為 Apache 專案進行維護。官方文件指出,它「提供了高效能的壓縮與編碼方案,以批次處理複雜的資料」。文件還補充說明,該格式「受到許多程式語言和分析工具的支援」。
其決定性的特性是排列方向。CSV 一次寫入一列:先寫入紀錄一的所有欄位,接著寫入紀錄二的所有欄位。而 Parquet 一次寫入一欄:先寫入第一欄的所有數值,接著寫入第二欄的所有數值。
這聽起來像是一個技術細節,但它帶來了兩個重大影響。單一欄中的數值通常彼此相似,這使得它們的壓縮效果遠比混合列更好。此外,如果一個查詢在 90 欄中只需要 3 欄,它只需讀取這 3 欄,而不需要掃描每一列並丟棄其中的大部分內容。
該格式有正式的規範。Apache 文件指出,「parquet-format 儲存庫託管了 Parquet 檔案格式的官方規範,定義了資料的結構與儲存方式」。
Parquet 檔案的結構
信封結構
每個 Parquet 檔案的開頭和結尾都使用相同的 4 個位元組。規範顯示,開頭有一個「4 位元組的魔術數字 'PAR1'」,而完全相同的魔術數字也出現在最末端。
在它們之間存放著資料,而接近尾端的地方則是詮釋資料(metadata)。在結尾的魔術數字之前,有一個「以位元組為單位的 4 位元組檔案詮釋資料長度(小端序,little endian)」。該數值會告訴讀取器需要往回跳多少距離才能找到詮釋資料區塊。
列群組與欄區塊
在信封結構內部,資料被進行了兩次劃分。規範將檔案描述為「此表格中有 N 個欄,並被拆分為 M 個列群組」。
列群組是一個水平切片——即一批列。在每個列群組中,每個欄的數值會一起儲存為一個欄區塊。因此,一個擁有 90 欄和 10 個列群組的檔案會包含 900 個欄區塊,每個區塊都是來自單一欄的連續數值。
這種雙重劃分正是實現選擇性讀取的關鍵。查詢可以跳過完全不可能包含符合條件之列的整個列群組,然後僅從剩餘的列群組中讀取所需的欄區塊。
為什麼詮釋資料位於尾端
這讓習慣有檔頭(header)的人感到驚訝。Apache 文件直接解釋了原因:「檔案詮釋資料是在資料之後寫入的,以便進行單次寫入(single pass writing)。」
串流輸出大型資料集的寫入器在寫入完成之前,無法得知每個區塊的最終位元組位置。將詮釋資料放在最後,意味著它永遠不需要回頭去修改檔頭。
讀取模式也由此而來。根據文件,檔案詮釋資料「包含所有欄區塊起始位置的定位」。它還補充說明,「讀取器預期會先讀取檔案詮釋資料,以找到它們感興趣的所有欄區塊」。
Parquet 的用途
您通常會在以下四種情況之一遇到 .parquet 檔案。
資料倉儲匯出。 當有人從現代倉儲中匯出大型表格時,這通常是預設格式,因為檔案大小能保持在易於管理的範圍內。
資料湖儲存。 存放在雲端物件儲存中的檔案通常會使用它,這正是因為引擎可以只讀取部分欄,而不需要下載所有內容。
團隊間的資料交接。 當資料工程師要傳送一整年的交易資料給您時,通常會選擇它,而不是體積大上數倍的 CSV。
分析工具間的交互傳輸。 由於該格式受到多種語言和工具的支援,它可以在系統之間傳輸,而不需要中間的轉換步驟。
共同的關鍵在於檔案大小。當 CSV 檔案大到難以輕鬆傳輸時,它就成了顯而易見的首選。
Parquet 對比 CSV
| Parquet | CSV | |
|---|---|---|
| 排列方向 | 欄導向 | 列導向 |
| 可用文字編輯器讀取 | 否,它是二進位格式 | 是 |
| 典型檔案大小 | 較小,透過欄壓縮實現 | 相同資料下體積較大 |
| 讀取少數欄位 | 僅讀取那些欄區塊 | 讀取整個檔案 |
| 資料類型 | 包含在檔案詮釋資料中 | 由開啟它的工具進行推斷 |
| 可透過按兩下開啟 | 通常不行 | 通常會在試算表軟體中開啟 |
| 最適合用於 | 大型表格、重複查詢 | 小型表格、快速檢查、通用分享 |
資料類型的處理方式值得特別說明。CSV 無法得知 00123 是數字還是字串,這就是為什麼在匯入時,前導零和日期常常會出錯。Parquet 會在詮釋資料中記錄類型,因此您寫入什麼數值,讀取出來的就是什麼數值。
關於此對比中列導向的部分,CSV 說明指南從另一個角度介紹了相同的內容。而 TSV 分析則介紹了以定位鍵(tab)分隔的變體。
核心優勢
真正具備加乘效果的壓縮。 將相似的數值相鄰儲存,能為編碼器提供更多發揮空間。Apache 文件將此歸功於「高效能的壓縮與編碼方案」。
欄剪枝(Column pruning)。 在 90 欄中讀取 3 欄,大約只需花費 3 欄的 I/O 開銷,而不是 90 欄。
跳過列群組。 由於詮釋資料記錄了每個列群組中的內容,讀取器可以在接觸它們之前直接丟棄整個切片。
資料類型完整保留。 日期依然是日期,識別碼也保留了前導零,因為綱要(schema)是隨檔案一同傳輸的。
單次寫入。 位於尾端的詮釋資料意味著非常巨大的檔案可以透過串流方式寫入。
廣泛的支援。 文件指出其支援「許多程式語言和分析工具」,因此幾乎不會遇到無法相容的死胡同。
Parquet 的局限性
Parquet 解決了儲存與檢索的問題,但它無法解答您對於檔案中實際內容的任何疑問。
它是二進位格式,因此您無法一眼看出內容。開啟 CSV 來檢查營收欄位是毛利還是淨利只需花費 5 秒鐘。而二進位檔案則需要工具輔助,您才能看到任何內容。
它也不適合用於小型資料。對於一個只有 200 列的對照表,詮釋資料的額外開銷和對工具的需求,遠超過任何壓縮帶來的好處。在這種情況下,CSV 是更好的格式,坦言這一點也是善用 Parquet 的一部分。
此外,它對資料品質毫無幫助。檔案中可能包含類型完美、壓縮高效的垃圾資料。例如重複的紀錄、混合了兩種貨幣的貨幣欄位,或者在三月份變更了綱要的客戶 ID。該格式保證的是還原度,而非正確性。
如果您不是工程師,該如何處理 Parquet 檔案
這就是實際應用上的落差。大多數商業工具都預設使用試算表,而 .parquet 檔案無法像 CSV 那樣直接開啟。
務實的做法是進行轉換。向產生該檔案的人索取您實際需要之欄位的 CSV 或 Excel 匯出檔,或者使用任何支援 Parquet 的工具自行轉換。雖然您會失去壓縮優勢,但一旦資料下載到您的電腦並縮小了範圍,這就無關緊要了。
從那時起,後續工作就是一般的分析。Powerdrill Bloom 的定價頁面列出了支援上傳 Excel、CSV、PDF 和文件,因此轉換後的匯出檔可以直接匯入。您可以使用自然語言提問,而不需要撰寫查詢語句。CSV AI 助手涵蓋了這條路徑,而資料連接器則適用於比起匯出、直接拉取資料更為合適的情況。
值得記住的區別是,Parquet 是您上游所做出的儲存決策。It 不是分析工具,一旦檔案送到您的辦公桌上,將其轉換為其他格式是正常的做法,而不是一種權宜之計。
結論
Parquet 是一種欄導向的儲存格式,其綱要和索引位於檔案尾端。這種設計帶來了高壓縮率、選擇性讀取以及可靠的資料類型,這也是為什麼它已成為處理任何大型資料的預設選擇。
但它無法帶來的是直觀的可視性。當檔案送達需要解答而非僅僅需要儲存的人手中時,下一個有用的步驟通常是提取特定範圍的資料並提出問題。
如果這正是您面臨的情況,請搭配轉換後的檔案嘗試使用 Powerdrill Bloom,並從將其轉換為圖表開始。
常見問題
Parquet 檔案有什麼用途?
Parquet 用於高效儲存大型表格資料集。它常用於資料倉儲匯出、資料湖儲存、團隊間的資料交接以及分析工具之間的交互傳輸。原因在於它具有良好的壓縮效果,且支援僅讀取選定的欄位。
Parquet 比 CSV 更好嗎?
對於需要重複查詢的大型表格,是的:它體積更小、包含資料類型,且支援欄剪枝。對於需要快速檢查或廣泛分享的小型表格,CSV 更為方便,因為它是文字格式且隨處皆可開啟。
我可以在 Excel 中開啟 Parquet 檔案嗎?
無法透過按兩下直接開啟,因為 Parquet 是二進位格式而非文字格式。常見的方法是先將其轉換為 CSV 或 Excel,或者使用能直接讀取 Parquet 的工具。
為什麼 Parquet 的詮釋資料儲存在檔案尾端?
Apache 文件解釋說,詮釋資料是在資料之後寫入的,「以便進行單次寫入」。串流輸出大型資料集的寫入器無法提前得知最終的區塊位置,因此最後寫入詮釋資料可以避免回頭修改檔頭。
Parquet 中的列群組是什麼?
列群組是表格的水平切片。規範將檔案的欄描述為「拆分為 M 個列群組」,每個欄在每個群組中儲存為獨立的區塊。這種版面配置讓讀取器可以同時跳過不需要的群組和欄。