ローカルだけで列指向ファイルを扱うために PyArrow を使う。
オプション等は記載していないので必要に応じてドキュメントを読むこと。
インストール
$ pip install pandas pyarrow
事前準備
import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd
CSVからParquetへの変換
CSV -> DataFrame -> Arrow Table -> Parquet というフローで書き出す。
# CSV -> DataFrame
df = pd.read_csv('/path/to/file.csv')
# DataFrame -> Arrow Table
table = pa.Table.from_pandas(df)
# Arrow Table -> Parquet
pq.write_table(table, '/path/to/file.pq')
Parquetの読み出しとDataFrameへのロード
# Parquet -> Arrow Table
table2 = pq.read_table('/path/to/file.pq')
# Arrow Table -> DataFrame
df2 = table.to_pandas()
圧縮オプション
snappy
, gzip
, brotli
, none
が選択可能。デフォルトは snappy
。
# brotli で圧縮して出力
pq.write_table(table, '/path/to/file-brotli.pq', compression='brotli')
圧縮率の比較
データによりけりなのでなんともいえないが、テストデータのCSVファイル(21,196行)だと以下のような結果になった。
ファイルフォーマット | 圧縮形式 | サイズ(KB) | 備考 |
---|---|---|---|
CSV | なし | 3154 | 元データ |
CSV | zip | 327 | zipコマンドで圧縮しただけ |
Parquet | なし | 811 | |
Parquet | Snappy | 540 | PyArrowのデフォルト |
Parquet | GZip | 370 | |
Parquet | Brotli | 345 |
Snappyは圧縮率を犠牲にして圧縮・展開速度を重視した形式で、Hadoop等の大規模データ基盤ではデファクトで活用されている形式であるが、ローカルPCだけでの利用を想定するならそこまで大規模なデータになることはないので、圧縮率重視のGZipやBrotliでもいい気がする。
参考
Using PyArrow with Pandas: https://arrow.apache.org/docs/python/pandas.html
Reading and Writing the Apache Parquet Format: https://arrow.apache.org/docs/python/parquet.html