Pythonで列指向のストレージフォーマットであるParquetファイルの入出力方法について解説します。
Contents
Parquetファイル
Parquetファイルとは、Twitter(現X社)とClouderaにより共同開発された列指向のデータフォーマットのことを言います。2015年にはApacheトップレベルプロジェクトとなっています。
Parquetファイルは、ビッグデータ関連のシステムの中心的な存在となる列指向のストレージフォーマットのことであり、拡張子は「.parquet
」です。
本記事では、Pythonを利用してParquetファイルを入出力する方法について解説します。
まずは、Parquetの特徴について簡単に触れ、その後Pythonでのプログラムを紹介します。Parquetについて既に理解している方は読み飛ばしていただいて構いません。
Parquetの特徴
Parquetファイルは、「列指向」のストレージ形式で、具体的には「.parquet
」拡張子を持つバイナリファイルです。データベースとして一般的に思い浮かぶDBMS(Oracle, SQLServer等)については、「行指向」のデータフォーマットとなっています。
行指向のデータベースでは、主にフロントエンドのシステムやサービスと密接に連携し、行単位で情報を検索するのに適しています。ただし、適切にインデックス情報が設定されないと非常に検索が遅くなります。
一方、Parquetの列指向のストレージ形式では、主にデータ分析のために最適化されており、大規模なデータに対して集計処理を高速にできるようになっています。
行指向と列指向のイメージを図にしてみると以下のようになります。例えば、価格列の合計や平均といった情報を製造日ごとに計算する等の場合には、大規模データから対象列を高速に取り出し計算できるため、列方向に最適化された列指向のデータフォーマットの方が適しています。
Parquetファイルは、以下のような特徴があります。
- 列指向:データを列単位で格納し、特定列に関するクエリを高速に処理可能
- 効率的な圧縮:同じデータ型のデータを連続して格納するため、高い圧縮率を実現
- ビッグデータシステムとの連携: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"]]
上記例では、pyarrow
のpa.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での扱い方を覚えてもらえればと思います。
pandasのto_parquetの公式ドキュメントはこちらを参照してください。
pandasのread_parquetの公式ドキュメントはこちらを参照してください。
pyarrowの公式ドキュメントはこちらを参照してください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。