Hiveで利用可能なストレージ形式でいくつかのテストを実行し、ParquetとORCを主要なオプションとして使用しています。 ORCはデフォルトの圧縮で1回、Snappyで1回含まれています。
私は、ParquetがORCと比較して時間/空間の複雑さにおいて優れていると述べている多くのドキュメントを読みましたが、私のテストは、私が経験したドキュメントと反対です。
データの詳細に従います。
Table A- Text File Format- 2.5GB
Table B - ORC - 652MB
Table C - ORC with Snappy - 802MB
Table D - Parquet - 1.9 GB
私のテーブルの圧縮に関する限り、寄木細工は最悪でした。
上記の表を使用したテストでは、次の結果が得られました。
行カウント操作
Text Format Cumulative CPU - 123.33 sec
Parquet Format Cumulative CPU - 204.92 sec
ORC Format Cumulative CPU - 119.99 sec
ORC with SNAPPY Cumulative CPU - 107.05 sec
列操作の合計
Text Format Cumulative CPU - 127.85 sec
Parquet Format Cumulative CPU - 255.2 sec
ORC Format Cumulative CPU - 120.48 sec
ORC with SNAPPY Cumulative CPU - 98.27 sec
列操作の平均
Text Format Cumulative CPU - 128.79 sec
Parquet Format Cumulative CPU - 211.73 sec
ORC Format Cumulative CPU - 165.5 sec
ORC with SNAPPY Cumulative CPU - 135.45 sec
where句を使用して特定の範囲から4列を選択する
Text Format Cumulative CPU - 72.48 sec
Parquet Format Cumulative CPU - 136.4 sec
ORC Format Cumulative CPU - 96.63 sec
ORC with SNAPPY Cumulative CPU - 82.05 sec
つまり、ORCはParquetよりも高速ですか?または、クエリの応答時間と圧縮率を向上させるためにできることはありますか?
ありがとう!
私は、これらの形式の両方に独自の利点があると言います。
高度にネストされたデータがある場合、寄木細工はGoogle Dremelのようにその要素をツリーとして保存するため、より良いかもしれません( こちらを参照 =)。
ファイル構造がフラット化されている場合、Apache ORCの方が優れている可能性があります。
私の知る限り、寄木細工はまだインデックスをサポートしていません。 ORCには軽量のインデックスが付属し、Hive 0.14から追加のブルームフィルターが追加されました。これは、特に合計操作に関して、クエリの応答時間を短縮するのに役立ちます。
Parquetのデフォルトの圧縮はSNAPPYです。テーブルA-B-CとDは同じデータセットを保持していますか? 「はい」の場合、1.9 GBにしか圧縮されないため、怪しいものがあるように見えます
あなたはこれを見ている:
Hiveにはベクトル化されたORCリーダーがありますが、ベクトル化された寄木細工のリーダーはありません。
Sparkには、ベクトル化された寄木張りのリーダーがあり、ベクトル化されたORCリーダーはありません。
Sparkは寄木細工で最高のパフォーマンスを発揮し、HiveはORCで最高のパフォーマンスを発揮します。
SparkでORCとParquetを実行すると、同様の違いがあります。
ベクトル化とは、行がバッチでデコードされることを意味し、メモリの局所性とキャッシュ使用率を劇的に改善します。
(Hive 2.0およびSpark 2.1時点で正しい)
さまざまなユースケースで、さまざまなファイル形式(Avro、JSON、ORC、およびParquet)を比較するベンチマークを行いました。
https://www.slideshare.net/oom65/file-format-benchmarks-avro-json-orc-parquet
データはすべて公開されており、ベンチマークコードはすべて次のオープンソースです。
ParquetとORCには、それぞれ長所と短所があります。しかし、私は単純な経験則に単純に従おうとしています-「データのネストと列の数」。 Google Dremelに従うと、寄木細工がどのように設計されているかがわかります。データを保存するために階層ツリーのような構造を使用します。ツリーが深くネストするほど。
ただし、ORCはフラット化されたファイルストア用に設計されています。したがって、データがより少ない列でフラット化されている場合は、ORCを使用できます。そうでない場合は、寄せ木張りが適しています。フラット化されたデータの圧縮は、ORCで驚くほど機能します。
大きなフラットファイルでベンチマークを行い、spark Dataframeに変換し、寄木細工とORC形式の両方でSに保存し、** Redshift-Spectrum **でクエリを実行しました。
Size of the file in parquet: ~7.5 GB and took 7 minutes to write
Size of the file in ORC: ~7.1. GB and took 6 minutes to write
Query seems faster in ORC files.
すぐに、ネストされたデータのベンチマークを行い、結果をここで更新します。