はじめに
ちゅらデータ株式会社 システムエンジニア きたっぴです。
以前より、データロードの際はスキーマ情報も保持しているParquet形式で受け渡しを行う手段があるという事は知ってはいましたが最近読んだ「クラウドデータレイク」にて登場したDelta Lake、Apache Icebergのベースとなっている技術ということなので今回改めてParquet形式とはなんぞやを学ぶこととしました。
Parquet形式とは
- カラムナーストレージフォーマット
- 列指向フォーマット。そのため、行指向フォーマットより高速に分析を行うことができる
- csv形式で保存するよりもファイルサイズが小さい
- 圧縮、エンコーディングによりファイルサイズの削減に成功している
端的に言えば、テキスト形式では閲覧できない形式であるがcsvファイルより軽量化され、分析を行う際も高速になる。いいことづくめのようだ。
以下、今回はカラムナーストレージフォーマットについての第一印象、及び調査結果を記載したいと思う。
カラムナーストレージフォーマット
列指向フォーマット。parquet形式では、指定可能な数の行グループに分割してデータは保存されている。その上で分割された列グループのデータを「カラム単位」で記憶を行っているため特定のカラムを利用した分析の際に不要なカラム情報を無視することが可能になり、高速の分析が可能となる。
説明を初めて読んだ際は行グループでの分割であれば行指向なのではないかと感じたがその後に行グループ内のデータの記憶方法が「カラム単位」という事で、分析時にカラム毎の取得ON/OFFが可能となるためこれは列指向であると考える。
行グループの分割数のメリットデメリットについても調査を行ってみた。
特徴 | 細かく分割する場合 | 分割しない場合(大きな行グループ) |
---|---|---|
クエリ性能 | 向上(プルーニングが効果的) | 低下(不要なデータの読み込みが発生) |
並列処理性能 | 向上(並列処理が容易) | 低下(並列処理が難しい) |
メモリ使用量 | 削減(小さなデータ量を読み込む) | 増加(大きなデータ量を読み込む) |
メタデータのオーバーヘッド | 増加(メタデータが多くなる) | 削減(メタデータが少なくなる) |
書き込み性能 | 低下(書き込み操作が頻繁) | 向上(書き込み操作が少ない) |
このあたりは一長一短あると思うのでデータソースの内容、及び分割方法によって分割サイズを考えることになるのだと思う。
ファイルサイズ
csvファイルよりもサイズが小さくなるようだが本当か?100万行のデータを用意して比較を行ってみた。
形式 | サイズ |
---|---|
csv形式 | 約30MB |
parquet形式 | 約50MB |
あれ?想定ではparquet形式の方がファイルサイズが小さくなくてはいけないはずだが何故だろう。
実は上記の作成時にはparquet形式作成時に各20行の行グループに分割していたためサイズがcsvより大きくなっていたと思われる。
行グループを1つとしてparquet形式で作成した場合の結果を合わせたものが下表になる。
形式 | サイズ |
---|---|
csv形式 | 約30MB |
parquet形式(20行での行グループ) | 約50MB |
parquet形式(行グループ1つのみ) | 約9MB |
最後に
ネット上で記事を読み漁ったレベルではparquet形式で保存することでファイルサイズは小さくなるもの。という理解だけであったが行グループの分割ルールによってはcsvより大きくなることもあることが分かった。理由としては、圧縮によるサイズ減の効果より行グループごとに定義しているメタデータが多く必要になったサイズ増の効果が上回ったものと思われる。
今回は、行グループの違いによる分析結果の差まで手が回らなかったがどれだけの違いが出るか試してみたいと思う。