この記事でわかること
- parquetなにそれ・おいしいの?から脱却できます
- parquetがCSVと比較したときのメリット・デメリットがわかります
- parquetの良さをテキストだけでなく、実コードを通じて感じることができます
parquetとは
本記事にたどり着いた方なら一度は調べたことかと思います。
Parquet は、効率的なデータの保存と検索のために設計された、オープンソースの列指向データファイル形式です。複雑なデータを一括処理するための効率的なデータ圧縮と符号化方式を提供し、パフォーマンスを向上させます。
いや、わからん!!!
列指向性?というキーワードはわかるがやっぱりわからん!!
と私自身なりました。
そこで、この記事ではparquetのメリットを肌で感じていただき、読み終わった頃にはparquetの良さを説明できることを目指します。
特に、CSVと比較されがちなのでCSVと比較してどうか?という視点を中心にやっていきたいと思います。
前準備
とりあえず、サンプルデータを用意します。
Parquetとの差をはっきりさせるために、ダウンロードしてきたCSVを下記のプログラムを通じて、かさ増ししておきましょう。
def replicate(): dx = pd.DataFrame() df = pd.read_csv("test_csv.csv", encoding="shift-jis") for _ in range(10): dx = pd.concat([dx, df]) _dx = dx.reset_index(drop=True) _dx.to_csv("test.csv") _dx.to_parquet("test.parquet")
これで17万行のデータをcsv
とparquet
それぞれで作ることができました。
parquetのメリット
parquetのメリットは色々あるのですが、ここでは初学者レベルでもわかるような内容の2点に絞りたいと思います。
ストレージ効率の向上
ストレージ効率、すなわち同じデータなのにCSVに比べてparquetの方がファイルサイズが小さくなります。
先ほど作ったファイルを見てましょう。
同じデータですが、
- CSVは、13MB
- Parquetは、1.3MB
と10倍の差があることがわかりました。
これは、parquetのほうがデータの圧縮率が高いためです(なぜparquetのほうがデータの圧縮率が高いかはここでは割愛)。
読み取り性能の向上
列指向性の強いparquetでは、必要な列だけを効率的に読み取ることができるため、特定の列だけを取得したい場合、読み込み速度が速くなります。
下記のコードで試してみましょう。
import time import pandas as pd def read_csv_and_get_row(): df = pd.read_csv("test.csv", usecols=['都道府県コード']) def read_parquet_and_get_row(): df = pd.read_parquet("test.parquet", columns=['都道府県コード']) if __name__ == '__main__': start = time.time() read_csv_and_get_row() print(time.time() - start) start = time.time() read_parquet_and_get_row() print(time.time() - start)
この実行結果は以下の通りです。
CSVに比べて、parquetは約3倍早いことがわかります。
parquet化するデメリット
ここまで、parquet化によるメリットを紹介してきました。 続いて、デメリットについても触れていきたいと思います。
人が読めない
これが最大のデメリットだと思います。
parquetはバイナリ形式のため、CSVのように各PCの内蔵ソフトウェアでは開くことができません。
そのため、非エンジニアとのやりとりには障壁になりがちです。
まとめ
parquetのメリットとデメリットをここまで紹介しました。
メリット
- ファイルサイズがCSVに比べて小さくなる
- 読み取り速度が早い
デメリット
- バイナリが故に、通常のソフトウェアでは読めない
という結論になります。
その他、細かいメリット・デメリットはありますがまずははじめの一方としては上記を認識していただけるといいかと思います。