注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
このページでは、データセットの投影が実際にどのように動作するかについての高度な詳細を説明し、データセットへのより最適化されたクエリを可能にします。投影の概要については、このページを参照してください。
内部的には、投影はあるアクセスパターンに最適化されたデータセットのコピーです。Foundry はデータセットの投影を子データセットとして保存します。これらは「投影」データセットと呼ばれます。親データセットは「標準」または「投影された」データセットと呼ばれます。
ビルドは、投影をメインデータセットの最新のデータと同期させるために使用されます。投影が最新でない場合でも使用されますが、あまり効果はありません。
投影されたデータセットが新しい SNAPSHOT
トランザクションを受け取ると、下流の投影はすべて古くなり、プロジェクトが再構築されるまで利益がありません。投影されたデータセットが APPEND
トランザクションを受け取ると、下流の投影は新しいトランザクションに対して部分的に古くなります。Foundry のクエリは、新しいデータを反映した結果を生成しながら、投影から利益を得られるように書き換えられます。
低レベルでは、投影は以下のいずれかです。
投影データセットは、Foundry データセットとして保存されます。このデータセットはリソースとしては表示されませんが、Projections
タブ内のリンクを介してアクセスできます。
投影を最新の状態に保つため、通常の Foundry ビルド システムを通じて非同期的にビルドされます。これにより、ユーザーはビルドの直後に投影されたデータセットを一貫してすぐに読み取ることができますが、投影データセットは定期的にビルドされる必要があります。
コンピューティングリソースの割り当てとコスト管理の柔軟性を確保するため、Foundry はこれらのビルドを自動的に作成しません。これらを設定するには、Projections
タブのスケジューラウィジェットを使用します。
適切なビルドの頻度に関する普遍的なルールはありません。主な決定要因は、クエリがデータセットの 投影されていない 部分でパフォーマンスターゲット内で実行できる必要があることです。たとえば、パイプラインが1時間あたり10 GBを書き込み、フィルター処理された読み取りがパフォーマンスターゲットを達成するために100 GB以上スキャンしてはならないと判断した場合、投影が少なくとも10時間ごとにビルドされるようにする必要があります。
投影では、オートスケーリングメカニズムを使用して、投影を構築するための適切なエグゼキュータ数を見つけます。投影ビルドが失敗するか時間がかかりすぎる場合を除いて、Spark プロファイルを手動で調整する必要はありません。
Foundry は、投影に関連するコスト(たとえば、ストレージやコンピューティング)をメインデータセットのプロジェクトに帰属させます。
コンパクションは、投影に対して実行される主なメンテナンス操作です。これは、小さなソート済みファイルの大規模なコレクションを、大きなソート済みファイルに結合するプロセスを指します。コンパクションは、投影ビルドプロセスの一部として投影に自動的に発生します。
コンパクションにより、メインデータセットの入力トランザクションの数に関係なく、読み取りパフォーマンスが独立します。これにより、投影は頻繁にインクリメンタルに書き込まれたりストリーミングデータセットの読み取りを高速化できます。投影ビルドは、たまに平均よりも長く実行されることがあります。これは通常、コンパクションが原因です。
投影がクエリを満たすために利用可能な場合、それはメインデータセットよりも 常に 優先されます。たとえメインデータセットが、特定のクエリをサポートするために最適化された方法で書き込まれていたとしても、クエリプランニングの意味論は大幅に簡略化されます。
以下のクエリについて、クエリプランニング中にさまざまな投影に割り当てられる優先度は以下のとおりです。
x = 1 AND y = 2
の場合、投影は以下の優先順位で選択されます。
x
および y
でソートされた投影x
および y
でソートされた投影(任意の列セットでバケット化されている)x
でソートされた投影x
でソートされた投影(任意の列セットでバケット化されている)F
でフィルタリングし、列 J
で結合する場合、投影は以下の優先度で選好されます。
J
でバケット化され、列 F
でローカルにソートされた投影F
でグローバルにソートされた投影F
でローカルにソートされた投影(列 J
以外の任意の列でバケット化されている)J
でバケット化された投影(列 F
以外のものでローカルにソートされている)これらの優先度は、フィルターが通常十分に選択的であり、結合よりもフィルターを最適化する方が良いという見解を反映していますが、必ずしもそうではありません。