20万件から1項目だけ読む場合、行ごとに持つ形は2.3MB、列ごとなら0.8MBでした。
さらに区切りが合えば、30日ぶんを読むのに36.5分の1まで絞れます。2つは掛け算になります。
自らの形を持ち歩き、型に合わせて詰めます。だから読む側は別の情報を要りません。
ORCの位置づけは、公式の1文にあります。ORCは、自らを説明し、型を知っている、列ごとのファイル形式であり、大規模な処理の作業負荷のために設計されたという記述です。
「自らを説明する」ので、別に形の定義を持ち回らずに読めます。
「型を知っている」ことの効果も明記されています。ORCのファイルは型を知っているので、書く側はその型に最も適した符号化を選び、書きながら内部の索引を作るという説明です。
1番目は、形を別に持つ方式との違いです。その方式の計測はAvroの記事にあり、書いたものを読むときにも形が要る前提でした。
4番目が代償になります。書く側で索引を作るぶん、書き込みは重くなります。
書くのが重く読むのが軽い形なので、一度書いて何度も読む用途に向きます。
逆に、1件ずつ足していく用途には向きません。索引と統計を作り直すことになるためです。
ORC is a self-describing type-aware columnar file format designed for Hadoop workloads.原文Apache ORC 公式ドキュメント この内容の有効期限2027-02-18
列ごとに並んでいるので、使う項目だけを読めます。全項目を使えば差は消えます。
ORCでは、書きながら索引が作られます。公式はORCのファイルは型を知っているので、書く側はその型に最も適した符号化を選び、書きながら内部の索引を作ると述べています。
並びは列ごとです。使う項目だけを読めることになります。その差を数えました。
注文の記録 200,000件。行ごとに並べると1件 12バイト・合計 2.3MB 一部の項目だけを読むとき、実際に触る量を比べる 読む項目 行ごと(触る量) 列ごと(触る量) 比 金額だけ 2.3MB 0.8MB 3.0倍 金額と日 2.3MB 1.1MB 2.0倍 分類と金額と日 2.3MB 1.3MB 1.7倍 全部 2.3MB 2.3MB 1.0倍
1項目なら3.0倍の差です。行ごとの側は、どの行でも2.3MBのまま変わりません。
全部を読むと1.0倍です。列ごとに並べる利点が消えます。
読む項目が増えるほど、列ごとに並べる利点が薄れる。
この計測には、型ごとの詰め方の効果が入っていません。同じ幅の値として数えています。
実際には、同じ値が続く列や、狭い範囲に収まる数値の列でさらに小さくなります。列ごとに並んでいれば、同じ種類の値が隣り合うためです。
その効果の大きさは中身によります。分類のような繰り返しの多い列で大きく、識別子のような全部違う列では小さくなります。
Because ORC files are type-aware, the writer chooses the most appropriate encoding for the type and builds an internal index as the file is written.原文Apache ORC 公式ドキュメント この内容の有効期限2027-02-18
索引はかたまりを飛ばすために使われます。飛ばせるかどうかは、並びと条件の関係で決まります。
ORCの索引は、読むかたまりを決めるのに使われます。公式は条件の押し下げはそれらの索引を使って、ある問い合わせのためにファイルのどのかたまりを読む必要があるかを判断する。行の索引は、探索を1万行の特定の集合まで狭められると述べています。
1万行まで狭められるのは、その条件に合う行がかたまっている場合です。散らばっていれば飛ばせません。
同じ考え方を、置き場所の区切りで測った結果があります。3年ぶんから期間で絞る場面です。
3年ぶん(1095日)・1日 8MB。合わせて 8,760MB 期間で絞る問い合わせに対し、区切り方を変えて読む量を見る 区切り方 1日ぶん 7日ぶん 30日ぶん 365日ぶん 1095日ぶん 区切らない 8,760MB 8,760MB 8,760MB 8,760MB 8,760MB 年で区切る 2,920MB 2,920MB 2,920MB 2,920MB 8,760MB 月で区切る 243MB 243MB 243MB 2,920MB 8,760MB 日で区切る 8MB 56MB 240MB 2,920MB 8,760MB
30日ぶんを読む場合、月で区切っていれば36.5分の1です。区切らなければ全部を読みます。
最終列を見てください。全期間を読む問い合わせでは、どの区切り方でも同じです。
項目の絞り込みと、かたまりの読み飛ばしは別々に効きます。
1項目だけを、30日ぶんに絞って読むなら、3.0倍と36.5倍の掛け算になります。
逆に、全項目を全期間ぶん読む問い合わせではどちらも効きません。この形式を選んだ意味がなくなります。
実在のORCの実装は使わず、列ごとと行ごとの並べ方をその場で作って触る量を数えています。型ごとの符号化や圧縮の効きは含めていないため、実際のORCはここより小さくなります。区切りによる絞り込みの計測も、置き場所を期間で区切った場合の計算で、ファイルの中のかたまりを飛ばす仕組みとは別物です。ここで見せているのは、項目の絞り込みとかたまりの読み飛ばしが掛け算になるという関係です。
Predicate pushdown uses those indexes to determine which stripes in a file need to be read for a particular query and the row indexes can narrow the search to a particular set of 10,000 rows.原文Apache ORC 公式ドキュメント この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る