列指向のデータストレージ形式、Apache Parquetについてもう少しだけ詳しく調べてみた
Contents
Apache Parquet
CSVとの違い
以前のAWS Athenaの記事でCSVとParquetとのファイル形式の違いでSQL実行時のRun Timeとスキャンデータ量にどの程度違いが出るのかを検証した。
CSVで8MByte程のファイルサイズで特定の1列だけを取り出すようなSQLの場合、スキャンデータ量はParquetの方が明らかに少なかった。
AWS Athenaはスキャン量に応じて課金されるのでParquet形式のほうが有利という事になるので、もう少しParquetについて調べてみることにした。
Apache Parquetとは
Twitter社とCloudera社(米国のソフトウェア会社)で共同開発されたオープンソースの列指向のデータストレージ形式。
データ圧縮されているのでバイナリ形式なのでCSVファイルと比較すると視認性は落ちる、というかテキストエディターで開いてみても何が入っているのかは分からない。
列指向とは
例えばRDBMSは指定した”行”をSQLで取得するので行指向なのに対して、データ分析では特定の列の値を合算したり平均を計算したりと同一列に対して何らかの計算をすることが多いので列をまとめて取り出すのに優位な構造になっている。
また同一列であれば項目の属性も同じなので圧縮が効きやすいとのメリットもある。
CSVとの比較
CSVとParquetとでSQLの実行結果の比較をしてみた。
- 項目数:23項目
- 行数:371,203行
- ファイルサイズ:107,320,858 Byte(CSV)、13,934,092 Byte(Parquet)
列の全行取り出し
実行SQL
select count_datetime from temp_humi_table
Run TimeはParquetの方が短い。
またCSVは例え列を指定していてもデータが行単位なのでスキャン量はファイル全体になるのに対してParquetは対象の列に対してのみスキャンをしているのでスキャン量がかなり抑えられる。
Run Time(実行時間)
CSV | 3.47 seconds |
Parquet | 2.25 seconds |
データスキャン量
CSV | 102.35 MB |
Parquet | 2.69 MB |
数値項目計算
where句は指定せずに数値項目の全行に対して計算を行う。
実行SQL
select avg(count_val) from temp_humi_table
Run TimeはParquetの方が短い。
またCSVはやはりファイル全体に対してスキャンをしているのに対してParquetのスキャン量はかなり少ない。
Parquetで先程のSQLよりもスキャン量が少ないのは項目の属性とサイズの違いと思われる。
Run Time(実行時間)
データスキャン量
CSV | 102.35 MB |
Parquet | 686.98 KB |
where句を指定して集計
where句を指定して特定の行の数値項目に対して計算を行う。
実行SQL
select avg(count_val) from temp_humi_table where error_flag = 2
Run TimeはやはりParquetの方が短い。
またCSVはやはり全データに対してスキャンをしているのに対してParquetのスキャン量はかなり少ない。
但しParquetもWhere句を指定したからと言ってスキャン量が減るわけでは無くむしろスキャン量が増している。
列指向なので「特定の行だけを取り出す」からと言ってスキャン量が減るわけでは無いのだと思われる。
Run Time(実行時間)
データスキャン量
CSV | 102.35 MB |
Parquet | 775.96 KB |
以上で今回の記事は終了とする。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント