注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
このページでは、データセットに対するクエリをより最適化するために、データセットのプロジェクションが実際にどのように機能するかを詳しく説明します。プロジェクションの概要については、こちらのページを参照してください。
内部的には、プロジェクションは特定のアクセスパターンに最適化されたデータセットのコピーです。Foundry は、データセットのプロジェクションを子データセットとして保存します。これらは「プロジェクション」データセットと呼ばれます。親データセットは「正規」データセットまたは「プロジェクション対象」データセットと呼ばれます。
ビルドによって、プロジェクションはメインデータセットの最新のデータに合わせて更新されます。プロジェクションが最新でなくても、引き続き使用されます。ただし、効果があまり得られない可能性があります。
プロジェクション対象データセットが新しい SNAPSHOT トランザクションを受け取ると、下流のプロジェクションはすべて完全に古い状態となり、プロジェクションが再ビルドされるまで効果はありません。プロジェクション対象データセットが APPEND トランザクションを受け取ると、下流のプロジェクションは新しいトランザクションに対して一部のみが古い状態になります。Foundry のクエリは、新しいデータを反映した結果を生成しながら、可能であればプロジェクションの効果を活用するように書き換えられます。
低レベルでは、プロジェクションは次のいずれかです。
プロジェクションデータセットは、Foundry データセットとして保存されます。このデータセットはリソースとしては表示されませんが、プロジェクションタブのリンクからアクセスできます。
プロジェクションを最新の状態に保持するため、通常の Foundry のビルドシステムを通じて非同期にビルドされます。これにより、ユーザーはビルド直後にプロジェクション対象データセットを一貫した状態で読み取れますが、プロジェクションデータセットが古い状態にならないよう、定期的にビルドする必要があります。
コンピューティングリソースの割り当てとコスト管理を柔軟に行えるようにするため、Foundry はこれらのビルドを自動的には作成しません。ビルドを設定するには、プロジェクションタブのスケジューラーウィジェットを使用します。
適切なビルド頻度について、すべてに当てはまるルールはありません。主な判断基準は、データセットのプロジェクションが作成されていない部分に対するクエリを、性能目標の範囲内で実行できる必要があるということです。たとえば、パイプラインが1時間あたり 10 GB を書き込み、フィルターを使用した読み取りで性能目標を満たすにはスキャンするデータ量を 100 GB 以下にする必要があると判断した場合、少なくとも10時間ごとにプロジェクションがビルドされるようにしてください。
プロジェクションは自動スケーリングの仕組みを使用して、プロジェクションのビルドに適したエグゼキューター数を決定します。プロジェクションのビルドに失敗するか、時間がかかりすぎる場合を除き、Spark プロファイルを手動で調整する必要はありません。
Foundry は、プロジェクションに関連するすべてのコスト(たとえば、ストレージやコンピューティング)を、 メインデータセットのプロジェクトに計上します。
コンパクションは、プロジェクションに対して行われる主要なメンテナンス操作です。これは、並べ替え済みの小さいファイルを大量にまとめて、並べ替え済みのより大きいファイルにする処理を指します。コンパクションは、プロジェクションのビルド処理の一部として、プロジェクションに対して自動的に行われます。
コンパクションによって、読み取り性能はメインデータセットの入力トランザクション数に依存しなくなります。これにより、プロジェクションは、インクリメンタルに頻繁に書き込まれるデータセットやストリーミングデータセットの読み取りを高速化できます。プロジェクションのビルドは、通常よりも時間がかかることがあります。これは通常、コンパクションによるものです。
クエリに対応できるプロジェクションが利用可能な場合、メインデータセットの書き込み方法がそのクエリにより適していても、常にメインデータセットより先にプロジェクションが選択されます。これにより、クエリプランニングの動作が大幅に単純化されます。
以下のクエリでは、クエリプランニング時に各プロジェクションに次の優先順位が割り当てられます。
x = 1 AND y = 2 の場合、プロジェクションは
次の優先順位で選択されます。
x と y で全体が並べ替えられているものx と y でローカルに並べ替えられているもの(バケット分割に使用する列は任意)x で全体が並べ替えられているものx でローカルに並べ替えられているもの(バケット分割に使用する列は任意)F で絞り込み、列 J で結合する場合、プロジェクションは
次の優先順位で選択されます。
F でローカルに並べ替えられたプロジェクションF で全体が並べ替えられたプロジェクションF でローカルに並べ替えられたプロジェクション(列 J 以外の任意の列でバケット分割)J でバケット分割されたプロジェクション(列 F 以外でローカルに並べ替え)これらの優先順位は、通常、フィルターによって十分に絞り込めるため、結合よりもフィルターに対して最適化したほうがよいという考え方を反映しています。ただし、必ずしもそうとは限りません。
プロジェクションは、自動メンテナンスの一環として、コンパクションされたファイルを定期的にビルドします。コンパクションは古いデータファイルをより大きいファイルに置き換えますが、置き換えられたファイルは古いトランザクションに残る場合があります。これらのトランザクションを削除する保持ポリシーがない場合、プロジェクションのビルドが実行されるにつれて、置き換えられたファイルがディスク容量を消費し続ける可能性があります。
このストレージを回収するには、保持ポリシーアプリケーションで、該当するスペースのカスタム保持ポリシーを設定します。
projection に設定します。これにより、親データセットではなくプロジェクションデータセットが対象になります。