Python中讀寫Parquet檔案的方法

banq發表於2024-05-13

Apache Parquet 檔案是資料科學家和任何使用 Hadoop 生態系統的人所使用的流行列式儲存格式。它的開發在壓縮和編碼方面非常高效。

您可以使用pyarrow 包透過 Python 讀取和寫入 Parquet 檔案。

現在讓我們來了解一下它是如何工作的!

安裝 pyarrow
第一步是確保您擁有所需的一切。除了 Python 程式語言之外,您還需要pyarrow和pandas包。您將使用 pandas,因為它是另一個使用列作為資料格式的 Python 包,並且可以很好地與 Parquet 檔案配合使用。

您可以使用 pip 安裝這兩個軟體包。開啟終端並執行以下命令:

python -m pip install pyarrow pandas

如果您使用 Anaconda,則需要使用此命令安裝 pyarrow。
conda install -c conda-forge pyarrow

Anaconda 應該已經包含 pandas,但如果沒有,您可以使用上面相同的命令,將 pyarrow 替換為 pandas。

現在您已經安裝了 pyarrow 和 pandas,您可以使用它來讀取和寫入 Parquet 檔案!

使用 Python 編寫 Parquet 檔案
使用 Python 編寫 Parquet 檔案非常簡單。將 pandas DataFrame 轉換為 Parquet 檔案的程式碼大約有十行。

開啟您最喜歡的 Python IDE 或文字編輯器並建立一個新檔案。您可以將其命名為類似的名稱parquet_file_writer.py或使用其他描述性名稱。然後輸入以下程式碼:


import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq


def write_parquet(df: pd.DataFrame, filename: str) -> None:
    table = pa.Table.from_pandas(df)
    pq.write_table(table, filename)
    

if __name__ == <font>"__main__":
    data = {
"Languages": ["Python", "Ruby", "C++"],
           
"Users": [10000, 5000, 8000],
           
"Dynamic": [True, True, False],
            }
    df = pd.DataFrame(data=data, index=list(range(1, 4)))
    write_parquet(df,
"languages.parquet")


對於此示例,您有三個匯入:

  • 一個用於pandas,這樣您就可以建立一個DataFrame
  • 一個用於pyarrow, 建立一個特殊pyarrow.Table物件
  • 一種用於pyarrow.parquet將表物件轉換為 Parquet 檔案

write_parquet   ()函式接受 pandas DataFrame 和儲存 Parquet 檔案的檔名或路徑。然後,將 DataFrame 轉換為 pyarrow Table 物件,然後使用該write_table()方法將其轉換為 Parquet 檔案,並將其寫入磁碟。

現在您可以閱讀剛剛建立的檔案了!

使用 Python 讀取 Parquet 檔案
讀取您之前使用 Python 建立的 Parquet 檔案更加容易。您將需要大約一半的程式碼行!

parquet_file_reader.py如果您願意,您可以將以下程式碼放入一個名為類似以下內容的新檔案中:

import pyarrow.parquet as pq

def read_parquet(filename: str) -> None:
    table = pq.read_table(filename)
    df = table.to_pandas()
    print(df)

if __name__ == <font>"__main__":    
    read_parquet(
"languages.parquet")


在此示例中,您將 Parquet 檔案讀取為 pyarrow Table 格式,然後使用 Table 的to_pandas()方法將其轉換為 pandas DataFrame。

當你列印出DataFrame的內容時,你將看到以下內容:

  Languages  Users  Dynamic
1    Python  10000     True
2      Ruby   5000     True
3       C++   8000    False


從上面的輸出中您可以看到 DataFrame 包含您儲存的所有資料。

使用 Parquet 檔案的優點之一是您可以僅讀取檔案的一部分而不是整個檔案。例如,您可以只讀取某些列,而不是整個檔案!

以下是其工作原理的示例:

import pyarrow.parquet as pq

def read_columns(filename: str, columns: list[str]) -> None:
    table = pq.read_table(filename, columns=columns)
    print(table)

if __name__ == <font>"__main__":
    read_columns(
"languages.parquet", columns=["Languages", "Users"])

要僅讀取 Parquet 檔案中的“語言”和“使用者”列,請傳入僅包含這些列名稱的列表。然後,當您呼叫 read_table()時,您傳入要讀取的列。

這是執行此程式碼時的輸出:

pyarrow.Table
Languages: string
Users: int64
----
Languages: [[<font>"Python","Ruby","C++"]]
Users: [[10000,5000,8000]]


這會輸出 pyarrow Table 格式,它與 pandas DataFrame 略有不同。它告訴您有關不同列的資訊;例如,Languages 是字串,Users 是 int64 型別。

如果您更喜歡僅使用 pandas DataFrames,pyarrow 包也允許這樣做。只要您知道 Parquet 檔案包含 pandas DataFrame,您就可以使用 read_pandas()而不是 read_table()。

這是一個程式碼示例:

pyarrow.Table
Languages: string
Users: int64
----
Languages: [[<font>"Python","Ruby","C++"]]
Users: [[10000,5000,8000]]


當您執行此示例時,輸出是一個 DataFrame,其中僅包含您要求的列:

  Languages  Users
1    Python  10000
2      Ruby   5000
3       C++   8000


使用 read_pandas() 和 to_pandas() 方法的優點之一是它們將在 DataFrame 中維護任何其他索引列資料,而 pyarrow Table 可能不會。

讀取 Parquet 檔案後設資料
您還可以使用 Python 從 Parquet 檔案獲取後設資料。當您需要檢查不熟悉的 Parquet 檔案以檢視它包含什麼型別的資料時,獲取後設資料會很有用。

下面是一個小程式碼片段,它將讀取 Parquet 檔案的後設資料和架構:

import pyarrow.parquet as pq

def read_metadata(filename: str) -> None:
    parquet_file = pq.ParquetFile(filename)
    metadata =  parquet_file.metadata
    print(metadata)
    print(f<font>"Parquet file: {filename} Schema")
    print(parquet_file.schema)

if __name__ ==
"__main__":
    read_metadata(
"languages.parquet")


有兩種方法可以獲取 Parquet 檔案的後設資料:

  • 使用pq.ParquetFile讀取檔案,然後訪問 後設資料屬性
  • 使用 pr.read_metadata(filename)代替

前一種方法的好處是您還可以訪問 ParquetFile物件的schema屬性。

當您執行此程式碼時,您將看到以下輸出:

<pyarrow._parquet.FileMetaData object at 0x000002312C1355D0>
  created_by: parquet-cpp-arrow version 15.0.2
  num_columns: 4
  num_rows: 3
  num_row_groups: 1
  format_version: 2.6
  serialized_size: 2682
Parquet file: languages.parquet Schema
<pyarrow._parquet.ParquetSchema object at 0x000002312BBFDF00>
required group field_id=-1 schema {
  optional binary field_id=-1 Languages (String);
  optional int64 field_id=-1 Users;
  optional boolean field_id=-1 Dynamic;
  optional int64 field_id=-1 __index_level_0__;
}


好的!您可以閱讀上面的輸出來瞭解資料的行數和列數以及資料的大小。該架構告訴您欄位型別是什麼。

總結
Parquet 檔案在大資料和資料科學相關領域變得越來越流行。 Python 的 pyarrow 包使 Parquet 檔案的處理變得簡單。您應該花一些時間嘗試本教程中的程式碼,並將其用於您自己的一些 Parquet 檔案。

相關文章