よしたく blog

ほぼ週刊で記事を書いています

PyArrowでCSVをParquetに変換する

今回は PyArrow を使って CSV を Parquet に変換してみた。

データレイクは生データを溜めることが主目的だが、レイクハウス型のアーキテクチャの流れもあり、データを利用したいサービス側が利用しやすいような整形化されたデータを用意する用途も増えてくると思う。 そうなると CSV ファイルでデータを持つよりかは Parquet で持つほうが、利便性が高いので、今後はこの変換業務も増えてくるように考えている。

今回は Pandas で CSV ファイルを読み込み、PyArrow を使って Parquet ファイルに出力する。 PyArrow から CSV ファイルを読み込んで Parquet ファイルに出力する方法もあるが、ファイル出力前に Pandas を使ってデータを整形するケースが多いと考え、こちらで試した。

インストール

まずはライブラリをインストールする。 pandas で CSV ファイルを読み込むため、pandas もインストールする。

pip install pyarrow pandas

コード

全体像

読み込んで出力するだけなのでシンプルなものになった。 ファイル形式を変更するだけでサイズが削減されるメリットは有るが、実務では欠損値を補ったりデータの整形が入るのでもっと長くなる。

import pandas as pd

import pyarrow as pa
import pyarrow.parquet as pq

df = pd.read_csv("./test.csv")

table = pa.Table.from_pandas(df)

pq.write_table(table, "./test.parquet")

まずは Pandas を使って CSV を読み込み、DataFrame に変換する。

df = pd.read_csv("./test.csv")

PyArrow のTable.from_pandasメソッドを使って、pandas.DataFrame から Arrow Table と呼ばれる形式に変換する。

table = pa.Table.from_pandas(df)

最後にwrite_tableメソッドで Arrow Table で持っているデータを Parquet ファイルに出力する。

pq.write_table(table, "./test.parquet")

ステップとしてはこれだけで CSV ファイルから Parquet ファイルに変換ができてしまう。とても簡単でびっくりした。

データ量の削減

Parquet ファイルは列指向でデータを持ち、同じデータが圧縮されるのでファイルサイズが減っていた。 しかし、このあたりはデータの中身によるのですべてのファイルが半分以下になるわけではないので気をつけたい。 改めて、ファイルの形式だけでなく、データの中身まで目を配っていかなければいけないなという感想を持った。

f:id:yoshitaku_jp:20220123174609p:plain

余談だが、最初はローカル環境で生成した 1GB の CSV ファイルを Parquet ファイルにしようとしたとき、数キロバイトまで圧縮されていた。 流石に圧縮されすぎているので、これはうまくいっていないケースだと思う。 結果的に大きいファイルを扱う際はプログラムを動かす環境などにも考慮が必要だと感じた。