背景
大きいデータセットのアドホック分析を AWS Athena で行うにあたり、csv データをApache Parquet 形式に変換することでスキャンデータを小さくすることによりコスト削減ができます。 Parquet 形式への変換はいくつか方法がありますが、今回は Python を使って行います。
ファイルを圧縮し、さらに Apache Parquet などの列形式に変換した場合、サイズは 3 分の 1 に圧縮され、Amazon S3 でのデータは最終的に 1 TB になります。ただしこの場合、Parquet は列形式なので、Amazon Athena で読み取る必要があるのは、実行されているクエリに関連する列のみです。当該のクエリは 1 つの列のみを参照するものであるため、Athena ではその列のみが読み取られ、ファイルの 3 分の 2 は読み取らなくてよいことになります。Athena で読み取られるのはファイルの 3 分の 1 のみであるため、S3 からスキャンされるデータは 0.33 TB のみになります。
Apache Parquetとは
Apache Parquet とは csv などの行志向のデータフォーマットと違い、列志向のフォーマットで、列単位でデータを取り出す分析用途に向いています。
参考:カラムナフォーマットのきほん 〜データウェアハウスを支える技術〜
Python における Parquet フォーマットのファイルサイズや読み込み時間の比較は下記の記事がとても参考になります。
参考:Python: Apache Parquet フォーマットを扱ってみる
手順
parquet への変換は pyarrow を使用します。
# pyarrow のインストール
$ pip install pyarrow
# Parquetフォーマットへの変換
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
df = pd.read_csv('../data/raw/train.csv')
table = pa.Table.from_pandas(df)
pq.write_table(table, '../data/processed/train.parquet')