Python での Parquet ファイルの読み取りと書き込み

Jay Shaw 2023年6月21日
  1. Python で Parquet ファイルを読み書きする Parquet インターフェイス
  2. Python で PyArrow モジュールを使用して DataFrame を Parquet ファイルに書き込む
  3. Python で PyArrow モジュールを使用して Parquet ファイルのメタデータを読み取る
  4. Python で Fastparquet エンジンを使用して Parquet ファイルにデータを書き込む
  5. Python で Fastparquet エンジンを使用して Parquet ファイルを読み取る
  6. まとめ
Python での Parquet ファイルの読み取りと書き込み

この記事では、Python で寄木細工のファイルを読み書きする方法に焦点を当てています。 これらのタイプのファイルは、データを列方向に格納するストレージ システム形式です。

Parquet は、CSV のような行ベースのファイル形式と比較して、パフォーマンスが最適化されたファイル形式です。 Parquet ベースのファイル システムでクエリを実行すると、必要なデータに非常に迅速に焦点を当てることができます。

Python で Parquet ファイルを読み書きする Parquet インターフェイス

Python は、エンジンを使用してデータ フレームに書き込み、寄木細工のファイルを読み取ります。 この記事では、データベースに寄木細工のファイルを書き込むいくつかのエンジンについて説明します。

データ分析システムで使用するために、Apache Parquet プロジェクトは、標準化されたオープンソースの列指向ストレージ形式を提供しています。 Apache Arrow は、Parquet ファイルから読み取ったり、Parquet ファイルに書き込んだりするデータに最適なインメモリ トランスポート レイヤーです。

Python で寄木細工のファイルを読み取る 2つの寄木細工のインターフェイスについて学習します: pyarrowfastparquet

Python の PyArrow モジュール

Apache Arrow または PyArrow は、インメモリ分析開発プラットフォームです。 ビッグデータシステムがデータを迅速に保存、処理、転送できるようにするテクノロジーのコレクションがあります。

このコードは pyarrow で Python にバインドされているため、Pandas を使用して寄木細工のファイルを読み書きできます。

pipconda を使えば、pyarrow を簡単にインストールできます。

pip の場合、次のコマンドを使用します。

pip install pyarrow

conda の場合、次のコマンドを使用します。

conda install -c conda-forge pyarrow

Python で PyArrow モジュールを使用して DataFrame を Parquet ファイルに書き込む

Python でデータ フレームを記述し、寄木細工のファイルを読み取る方法を理解するために、以下のプログラムで Pandas テーブルを作成しましょう。

必要なインポートは次の 4つです。

  1. pyarrow - 寄木細工の製品を書くため。
  2. numpy - 多次元配列用。
  3. pandas - データ フレームの作成用。
  4. parquet - pyarrow のサブ機能。

このプログラムは、整数、文字列、ブール値などの複数のタイプのデータセットを含むデータフレーム store1 を作成します。 インデックス リストは 'abc' に設定され、行をアルファベット順に並べます。

変数 table1 では、構文 Table.from_pandas() を使用して Pandas テーブルが作成されます。 この表は、結果を確認するために印刷されます。

import pyarrow.parquet as pq
import numpy as np

import pandas as pd

import pyarrow as pa

store1 = pd.DataFrame(
    {
        "first": [5, np.nan, -9],
        "second": ["apple", "samsung", "mi"],
        "third": [False, False, True],
    },
    index=list("abc"),
)

table1 = pa.Table.from_pandas(store1)
print(table1)

出力:

C:\python38\python.exe "C:/Users/Win 10/main.py"
pyarrow.Table
first: double
second: string
third: bool
__index_level_0__: string
----
first: [[5,null,-9]]
second: [["apple","samsung","mi"]]
third: [[false,false,true]]
__index_level_0__: [["a","b","c"]]

Process finished with exit code 0

これで、このデータは write_table を使用して parquet 形式で書き込まれます。 寄木細工のファイルを書き込むとき、write_table() 関数には、さまざまな設定を制御するためのいくつかの引数が含まれています。

  1. data_page_size - このパラメーターは、列チャンク内のエンコードされたデータ ページのおおよその量を調整します。 現在、1MB がデフォルト値です。
  2. flavor - spark などの Apache Spark Parquet コンシューマに固有の互換性設定を提供します。
  3. version - これは適切な Parquet 形式のバージョンです。 1.0 以上の値は以前のリーダーとの互換性を保証しますが、2.4 以上の値はより多くの Parquet タイプとエンコーディングを有効にします。

このプログラムでは、テーブル table1 と寄木細工の parquet.txt を書き込むためのネイティブ ファイルで write_table() パラメータが提供されます。

ファイルの出所は、文字列を使用せずに示すことができます。 次のいずれかが可能です。

  • 文字列としてのファイル パス
  • ネイティブ PyArrow ファイル
  • Python のファイル オブジェクト

このテーブルを読み取るには、read_table() 関数が使用されます。 変数 table2 を使用してテーブルをロードします。

最後に、この寄木細工のファイルは table2.to_pandas() を使用して Pandas データフレームに変換され、出力されます。

pq.write_table(table1, "sample_file.parquet")

table2 = pq.read_table("sample_file.parquet")

table2.to_pandas()

print("\n", table2)

出力:

C:\python38\python.exe "C:/Users/Win 10/main.py"

 pyarrow.Table
first: double
second: string
third: bool

__index_level_0__: string
----

first: [[5,null,-9]]
second: [["apple","samsung","mi"]]
third: [[false,false,true]]
__index_level_0__: [["a","b","c"]]

Process finished with exit code 0

通常、寄木細工のファイルは巨大なデータ ファイルであり、Python で寄木細工のファイルを読み取ると、読み込みに時間がかかります。 そのため、ファイル全体をロードする代わりに、特定の列を渡してデータをすばやく読み取ることができます。

変数 table3 では、pq.read_table 関数を使用してデータを書き込みます。 パラメータ ブラケット内には、firstthird の 2つの列が用意されています。

table3 = pq.read_table("parquet.txt", columns=["first", "third"])
print(table3)

出力には、選択した列が表示されます。

出力:

C:\python38\python.exe "C:/Users/Win 10/main.py"
pyarrow.Table
first: double
third: bool
----
first: [[5,null,-9]]
third: [[false,false,true]]

Process finished with exit code 0

ソースとして Pandas データ フレームを使用してファイルから列のサブセットを読み取るときに、read_pandas を使用して余分なインデックス列データを保持します。

table4 = pq.read_pandas("parquet.txt", columns=["second"]).to_pandas()
print(table4)

出力:

C:\python38\python.exe "C:/Users/Win 10/main.py"
       second
a    apple
b  samsung
c       mi

Process finished with exit code 0

文字列ファイル パスまたは NativeFile のインスタンス (特にメモリ マップ) は、通常、読み取り速度が最も遅い Python ファイル オブジェクトよりも優れたパフォーマンスを発揮します。

pa.Table.from_pandas を使用してテーブルを Arrow テーブルに変換し、インデックス (行ラベル) を追跡する場合、1つ以上の特別な列が自動的に作成されます。 インデックスに価値がない場合は、preserve index=False を渡すことで省略できます。これは、インデックスを保存するにはより多くのストレージ スペースが必要になるためです。

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

store = pd.DataFrame(
    {
        "first": [5, np.nan, -9],
        "second": ["apple", "samsung", "mi"],
        "third": [False, False, True],
    },
    index=list("abc"),
)

print(store)

table = pa.Table.from_pandas(store, preserve_index=False)
pq.write_table(table, "sample_file.parquet")
t = pq.read_table("sample_file.parquet")

print("\n", t.to_pandas())

表示されている寄木細工のファイルのインデックスは消去されています。

出力:

C:\python38\python.exe "C:/Users/Win 10/main.py"
   first   second  third
a    5.0    apple  False
b    NaN  samsung  False
c   -9.0       mi   True

    first   second  third
0    5.0    apple  False
1    NaN  samsung  False
2   -9.0       mi   True

Process finished with exit code 0

Python で PyArrow モジュールを使用して Parquet ファイルのメタデータを読み取る

read_table メソッドが使用する ParquetFile クラスは、ファイルからのデータの読み取りに加えて、メタデータの読み取りなどの追加機能を提供します。

import pyarrow.parquet as pq

parquet_file = pq.ParquetFile("example.parquet")
print(parquet_file.metadata)

出力:

C:\python38\python.exe "C:/Users/Win 10/main.py"
<pyarrow._parquet.FileMetaData object at 0x000001DADCBDCA90>
  created_by: parquet-cpp-arrow version 9.0.0
  num_columns: 4
  num_rows: 3
  num_row_groups: 1
  format_version: 2.6
  serialized_size: 2580

Process finished with exit code 0

Python で Fastparquet エンジンを使用して Parquet ファイルにデータを書き込む

これは寄木細工のファイル形式の Python インターフェイスです。

このプログラムは、fastparquet を使用して寄木細工のファイルに書き込みます。 studentmarks の 2つの列を持つデータ フレーム store が作成されます。

データ フレームは、dataframe.to_parquet() 関数を使用して寄木細工のファイル sample.parquet に書き込まれます。

エンジンは fastparquet として選択されていますが、pyarrow に設定することもできます。

import pandas as pd

store = pd.DataFrame(
    {
        "student": ["Michael", "Jackson", "N", "John", "Cena"],
        "marks": [20, 10, 22, 21, 22],
    }
)

print(store)
store.to_parquet("sample.parquet", engine="fastparquet")

出力:

C:\python38\python.exe "C:/Users/Win 10/main.py"
   student  marks
0  Michael     20
1  Jackson     10
2        N     22
3     John     21
4     Cena     22

Process finished with exit code 0

寄木細工のファイルにデータが書き込まれているので、ファイルを読み込んでみましょう。

Python で Fastparquet エンジンを使用して Parquet ファイルを読み取る

寄木細工のファイルは pd.read_parquet 関数を使用して読み取られ、エンジンを fastparquet に設定し、変数 df 内に保存します。 その後、結果が印刷されます。

df = pd.read_parquet("sample.parquet", engine="fastparquet")
print(df)

出力:

C:\python38\python.exe "C:/Users/Win 10/PycharmProjects/read_parquet/main.py"
   student  marks
0  Michael     20
1  Jackson     10
2        N     22
3     John     21
4     Cena     22

Process finished with exit code 0

まとめ

この記事では、Python で寄木細工のファイルを読み取る方法について説明します。 プログラムの例では、pyarrowfastparquet の両方を使用して寄木細工のファイルを読み取る方法を示しています。

読者は、Python で寄木細工のファイルを読み取るプログラムを簡単に作成できる必要があります。

関連記事 - Python File