pandas

【pandas】Parquetファイルの入出力

【pandas】Parquetファイルの入出力

Pythonで列指向のストレージフォーマットであるParquetファイルの入出力方法について解説します。

Parquetファイル

Parquetファイルとは、Twitter(現X社)とClouderaにより共同開発された列指向のデータフォーマットのことを言います。2015年にはApacheトップレベルプロジェクトとなっています。

Parquetファイルは、ビッグデータ関連のシステムの中心的な存在となる列指向のストレージフォーマットのことであり、拡張子は「.parquet」です。

本記事では、Pythonを利用してParquetファイルを入出力する方法について解説します。

まずは、Parquetの特徴について簡単に触れ、その後Pythonでのプログラムを紹介します。Parquetについて既に理解している方は読み飛ばしていただいて構いません。

Parquetの特徴

Parquetファイルは、「列指向」のストレージ形式で、具体的には「.parquet」拡張子を持つバイナリファイルです。データベースとして一般的に思い浮かぶDBMS(Oracle, SQLServer等)については、「行指向」のデータフォーマットとなっています。

行指向のデータベースでは、主にフロントエンドのシステムやサービスと密接に連携し、行単位で情報を検索するのに適しています。ただし、適切にインデックス情報が設定されないと非常に検索が遅くなります。

一方、Parquetの列指向のストレージ形式では、主にデータ分析のために最適化されており、大規模なデータに対して集計処理を高速にできるようになっています。

行指向と列指向のイメージを図にしてみると以下のようになります。例えば、価格列の合計や平均といった情報を製造日ごとに計算する等の場合には、大規模データから対象列を高速に取り出し計算できるため、列方向に最適化された列指向のデータフォーマットの方が適しています。

行指向と列指向の違い

Parquetファイルは、以下のような特徴があります。

  1. 列指向:データを列単位で格納し、特定列に関するクエリを高速に処理可能
  2. 効率的な圧縮:同じデータ型のデータを連続して格納するため、高い圧縮率を実現
  3. ビッグデータシステムとの連携:Hadoop, Spark, Hiveといったビッグデータ処理のための各種システムと容易に連携可能

上記のような特徴から、ビッグデータを分析するようなケースでParquetファイルを採用することは非常に理にかなっています。

Parquetファイルの入出力方法

以降では、Parquetファイルの入出力方法について解説します。Parquetファイルを扱う簡単な方法は、データ解析の主要なライブラリであるpandasを使用することです。

pandasのParquetファイル入出力機能は内部で、pyarrow等のライブラリを使用して実装されています。以降では、pandasでのParquetファイル入出力方法を紹介します。また、pandasを使わずにpyarrowを使用して実装する方法も簡単に紹介しようと思います。

以降で紹介するプログラムではpandasやpyarrowを使用するため、インストールしていない場合は、以下のpipでインストールをしてください。

pip install pandas
pip install pyarrow

Parquetファイルを書き込む to_parquet

Parquetファイルを書き込む際には、以下のようにpandasのto_parquetメソッドを使用します。

import pandas as pd

# データの準備
data = {"column1": [1, 2, 3, 4, 5], "column2": ["A", "B", "C", "D", "E"]}

# pandasデータフレームの作成
df = pd.DataFrame(data, index=["a", "b", "c", "d", "e"])
print(df)

# parquet形式で保存する
df.to_parquet("./data.parquet")

# # indexを保存しない場合
# df.to_parquet("./data.parquet", index=False)
【実行結果】
   column1 column2
a        1       A
b        2       B
c        3       C
d        4       D
e        5       E

上記例では、辞書で用意したデータでpandasのデータフレームを作成し、to_parquetメソッドで保存しています。to_parquetメソッドでは、保存先のファイルパスを指定するだけでParquetファイルを保存できます。

なお、今回作成したデータフレームでは、index=["a", "b", "c", "d", "e"]というようにインデックスを作成しましたが、Parquetファイル保存時にインデックスを保存しないようにする場合は、コメントアウトしてある以下の部分のようにindex=Falseを指定することで対応できます。

# indexを保存しない場合
df.to_parquet("./data.parquet", index=False)

Parquetファイルを読み込む read_parquet

Parquetファイルを読み込む際には、以下のようにpandasのread_parquet関数を使用します。

import pandas as pd

# Parquetデータの読み込み
df = pd.read_parquet("./data.parquet")
print(df)
【実行結果】
   column1 column2
a        1       A
b        2       B
c        3       C
d        4       D
e        5       E

上記のようにParquetファイルを読み込む際には、read_parquetに読み込むファイルパスを指定します。

to_parquetはデータフレームのメソッドであったのに対して、pd.read_parquetと呼び出している通り、pandasの関数である点に違いがあるので覚えておきましょう。

pyarrowを使ったファイルの入出力

上記で紹介してきたpandasは内部でpyarrow等のライブラリを利用しています。pandasを使用せずpyarrowを直接利用してParquetファイルを入出力することも可能です。

以下の例で簡単に見ておきましょう。

import pyarrow as pa
from pyarrow import parquet

# データの準備
data = {"column1": [1, 2, 3, 4, 5], "column2": ["A", "B", "C", "D", "E"]}
print(data, "\n")

# Arrowテーブル形式に変換する
table = pa.Table.from_pydict(data)
print(table)

# Parquet形式で保存する
parquet.write_table(table, "./data_arrow.parquet")
【実行結果】
{'column1': [1, 2, 3, 4, 5], 'column2': ['A', 'B', 'C', 'D', 'E']} 

pyarrow.Table
column1: int64
column2: string
----
column1: [[1,2,3,4,5]]
column2: [["A","B","C","D","E"]]

上記例では、pyarrowpa.Table.from_pydictにより辞書データをArrowテーブル形式に変換しています。pyarrowの中にparquetというものがあるためインポートして、Arrowテーブル形式のデータをwrite_tableでParquet形式で保存することができます。

読み込みも同様に見てみましょう。

from pyarrow import parquet

# Parquetデータの読み込み
table = parquet.read_table("./data_arrow.parquet")
print(table, "\n")

# テーブルを辞書形式に変換
data = table.to_pydict()
print(data)
【実行結果】
pyarrow.Table
column1: int64
column2: string
----
column1: [[1,2,3,4,5]]
column2: [["A","B","C","D","E"]] 

{'column1': [1, 2, 3, 4, 5], 'column2': ['A', 'B', 'C', 'D', 'E']}

読み込みはpyarrowにあるparquetをインポートし、read_tableでファイルパスを指定します。読み込まれるファイルはArrowテーブル形式のため、辞書に変換して扱う場合は、to_pydictで変換します。

上記のようにpandasを介さずともpyarrowだけでParquetファイルの操作も可能です。pyarrowは、低レベルなAPIを提供しているため、特定の操作や最適化を行いたい場合は、pandasよりも細かい制御が可能です。

ただし、多くの場面でデータ分析を行う際には、pandasの方が機能が豊富で利用者にとって扱いやすいため、pandasを採用する方がよいケースが多いと思います。利用場面や要件によりpyarrowの直接利用を検討してみてください。

まとめ

Pythonで列指向のストレージフォーマットであるParquetファイルの入出力方法について解説しました。

Parquetファイルは、ビッグデータ関連のシステムの中心的な存在となる列指向のストレージフォーマットです。Parquetを扱う簡単な方法は、データ解析の主要なライブラリであるpandasを使用することです。本記事では、pandasを使ってParquetファイルを入出力を行う方法を例を使って紹介しました。

Parquetは、データ分析でよく利用されるファイルですので、ぜひPythonでの扱い方を覚えてもらえればと思います。

Note

pandasのto_parquetの公式ドキュメントはこちらを参照してください。
pandasのread_parquetの公式ドキュメントはこちらを参照してください。

pyarrowの公式ドキュメントはこちらを参照してください。