pandas

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

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

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 ファイルの入出力方法

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

pandas の Parquet ファイル入出力は内部で pyarrow を使用して実装されています。以降では、pandas での Parquet ファイル入出力方法を紹介します。また、pandas を使わずに pyarrow を使用して実装する方法も紹介します。

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

pip install pandas
pip install pyarrow

Parquet ファイルを書き込む to_parquet

Parquet ファイルを書き込むには、pandasの DataFrame の 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 は、DataFrame のメソッドであったのに対して 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 の 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']}

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

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

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

まとめ

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

Parquet ファイルは、ビッグデータ関連のシステムの中心的な存在となる列指向のストレージフォーマットです。Parquet を扱う簡単な方法は、データ解析の主要なライブラリである pandas を使用することです。

この記事では、pandas を使って Parquet ファイルを入出力を行う方法を紹介しました。また、pandas 内部で使われている pyarrow を直接使う方法も紹介しています。

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

pandas 関数/メソッドのドキュメントは以下を参照してください。

to_parquet

read_parquet

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

ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド
ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました