同じ20万行の表を保存したところ、CSVは20.44MB、Parquetは1.11MBでした。5.4%です。
1列だけ読んで合計する処理は、CSVで44.0ミリ秒、Parquetで1.4ミリ秒でした。31倍の差です。
同じ20万行をCSVとParquetで保存して測りました。大きさも読み込みも桁が変わります。
Parquetで何がどれだけ変わるのかを、実際に保存して測りました。用意したのは出張申請を模した20万行・8列の表です。
列は番号・課・目的・勤務地・日数・金額・海外かどうか・備考です。備考だけは行ごとに違う文字列にしました。
pacsv.write_csv(tbl, paths['csv'])
for name, comp in [('parquet-none', 'none'),
('parquet-snappy', 'snappy'),
('parquet-zstd', 'zstd')]:
pq.write_table(tbl, os.path.join(TMP, f'{name}.parquet'), compression=comp)
形式 大きさ CSVとの比 CSV 20.44 MB 100.0% Parquet(圧縮なし) 13.22 MB 64.7% Parquet(snappy) 2.22 MB 10.8% Parquet(zstd) 1.11 MB 5.4%
上の表を見てください。20.44MBが1.11MBになりました。CSVの5.4%です。
列 型 保存後の大きさ 1行あたり id INT32 896.7 KB 4.59 B ka BYTE_ARRAY 0.9 KB 0.00 B mokuteki BYTE_ARRAY 1.8 KB 0.01 B site BYTE_ARRAY 1.3 KB 0.01 B nissu INT32 1.4 KB 0.01 B kingaku INT32 6.0 KB 0.03 B kaigai INT32 0.9 KB 0.00 B biko BYTE_ARRAY 223.1 KB 1.14 B
課の列は20万行で0.9KBです。値が8種類しかないので、ほとんど場所を取りません。
一方で備考の列は223.1KBです。行ごとに違う文字列なので、まとめても縮みません。
形式 かかった時間 読んだ大きさ CSV 44.0 ms 20.44 MB Parquet(zstd) 1.4 ms 1.11 MB 読む列 かかった時間 1列(kingaku) 2.0 ms 2列(kingaku, nissu) 2.2 ms 3列(+ka) 3.8 ms 備考も含む 38.3 ms
金額の列だけを合計する処理は44.0ミリ秒が1.4ミリ秒になりました。31倍です。
ただし備考の列まで含めると38.3ミリ秒まで戻ります。CSVの44.0ミリ秒に近い値です。
読む列を絞れば速い。全列を読むなら差は縮まる。
It provides high performance compression and encoding schemes to handle complex data in bulk and is supported in many programming languages原文Apache Parquet「Overview」 この内容の有効期限2027-02-18
列ごとにまとめて保存するファイル形式です。行ごとに並べるCSVとは、並べ方が違います。
Parquetは、列ごとにまとめて保存するファイル形式です。公式の説明でも効率的なデータの保存と取り出しのために設計された、列を向いたオープンソースのデータファイル形式だとされています。
CSVは1行ぶんを続けて書きます。番号・課・目的・金額の順で1行、次の行も同じ順で並びます。
Parquetは1列ぶんを続けて書きます。番号だけを20万個、次に課だけを20万個、という並びです。
前の節の結果は、1番目と2番目がそのまま出たものです。課の列が0.9KBまで縮み、1列だけ読むと1.4ミリ秒で済みました。
同じ説明は、大量の複雑なデータを扱うための高性能な圧縮と符号化の方式を備えており、多くのプログラミング言語で対応されているとしています。
前の節でも、圧縮なしで13.22MB、方式を変えて2.22MBと1.11MBでした。同じ形式でも指定によって倍以上変わります。
表の中身は式で作った値です。実際の業務データとは値の散らばり方が違います。特に課や目的のように値の種類が少ない列は、この計測より縮まないことがあります。まず自分のデータで同じ比較をしてください。問い合わせの速さはDuckDBの記事でも扱います。
Apache Parquet is an open source, column-oriented data file format designed for efficient data storage and retrieval.原文Apache Parquet「Overview」 この内容の有効期限2027-02-18
読む列を絞る使い方で効きます。1件ずつ書き足す用途や、全列を読む用途では利点が出ません。
Parquetはどんな場面でも速くなるわけではありません。前の節の実測が、その境目を示しています。
いちばん効くのは列の一部だけを使う集計です。20万行から金額を合計する処理が1.4ミリ秒でした。
保存の量も効きます。1.11MBと20.44MBなので、置き場の費用も、送る時間も18分の1になります。
2番目が実務では効きます。取引が発生するたびに1行追記するという使い方には向きません。
現実には、受け取りはCSVで、溜めるときにParquetへ変えるという組み方になります。取り込みの時点で1回だけ変換します。
形式そのものは公開されています。データがどう構造化され保存されるかを定めた公式の仕様が置かれているので、特定の製品に縛られません。
読む列を絞る使い方でだけ、桁が変わる。
The parquet-format repository hosts the official specification of the Parquet file format, defining how data is structured and stored.原文Apache Parquet「Overview」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る