はじめに
仕事ででかいサイズのファイルを扱うことがあるので、ファイルサイズを小さくしたいという需要が僕の中にはあるのだが、その需要を満たしてくれる候補にParquetファイルがある。
hogehoge.parquet
という拡張子で、そのままparquetである。
なんとなくファイルサイズが小さいということは知っているのだが、なぜ小さいのかはまだ分かっていないので、今回調べてみようと思う。
Parquetファイルとは何だ
Chat-GPTにまとめてもらったParquetファイルの説明は以下だ。
Parquetファイルは、Apache Parquetというカラム指向のデータフォーマットで、主に大規模データ処理や分析で使われます。特徴は以下の通りです:
カラム指向:列ごとにデータを保存するため、特定の列だけを効率的に読み込める。
圧縮効率が高い:同じ型のデータがまとまるので圧縮しやすく、ストレージ節約になる。
スキーマ情報を持つ:データ型や構造がファイル内に記録され、互換性を保ちやすい。
高速なI/O:大規模データを分散処理(SparkやHadoopなど)で扱うのに適している。
広い対応環境:Python(pandas, PyArrow)、R、Spark、BigQueryなど多くのツールで利用可能。
要するに、「大規模データを効率的かつ圧縮して扱える、分析向けのカラム型データフォーマット」です。
もう少し調べたので補足すると、CSVのようなファイルは行志向ファイルと呼ばれ、1行ごとにすべての列のデータがまとめて格納されているのに対し、Parquetは列(カラム)志向ファイルであり、列ごとにデータをまとめて格納しているとのこと。
これを実際のデータフレームの形で見てみると、以下のようになる。
# 行志向
(1, Yosuke, 25), (2, Yusuke, 30), (3, Kosuke, 28)
# 列志向
ID: [1, 2, 3]
Name: [Yosuke, Yusuke, Kosuke]
Age: [25, 30, 28]
これをテーブルで見た場合、行志向の方は各観測(それぞれの括弧)が縦に積み重なり、列志向の方は各変数(ID, Name, Age)を縦にして横に並べられる形になるのがお分かりいただけると思う。
これらにはもちろんそれぞれメリットがあるから両方存在しているわけなのだが、列志向データが分析に向いている点はどこなのだろうか。
列志向データの強み
処理の効率化
そこまで大きくないファイルではあまり実感がわかないと思うが、分析に必要なデータを抽出してくる過程で強みが発揮されるようだ。
1億行もあるような大きいデータにおいて、売上高の合計を計算したい場合、売上高の変数を読み込めばよいわけで、列志向データであればこの列だけを読み込むことができる。
一方の行志向データであれば、一度すべての行を読み込んでから(すなわちすべての列も必然的に読み込まれた上で)売上高の列を取得することになり、ここで非効率が生じてしまう。
つまり、必要な列だけを高速に処理できるため、大量データの集計や分析が効率的というのが強みと言える。
データサイズの削減
また、冒頭に書いた通り、データサイズが小さいというのもメリットである。各列には同じ型のデータ(数値型、文字型等)が揃っているため、効率よく圧縮できるそうだ(ランレングス圧縮)。圧縮について説明しているページによると、
例えば、文字列
AAAABBBCCDAA
をランレングス圧縮すると、4A3B2C1D2A
という形式になります。このように、連続する同じデータを短縮して表現することで、データのサイズを削減することができます。
ということで、短縮して表現できることがファイルサイズを小さくできる要因らしい。
個人的にはむしろこっちの方が実務的にはありがたいと思っているが、そこは仕事によるといったところだろうか。
まとめ
Parquetファイルは処理を効率化できる点、ファイルサイズを小さくできる点が特徴として挙げられる。そしてこれは、列志向データであるという特徴がポイントであることが分かった。
色々なデータを保管していると、気づいたらストレージが少なくなってきている…ということがよくあるので、個人的には重宝している。
今回は特徴を知ることが目的だったが、使い方についてはまたtipsの方でまとめたいと思う。その際にどれくらいファイルサイズを小さくできるのか、ファイルの中身はどうなっているのかを見ていければと思う。