データ統合パイプラインの最適化とビルドデータセットプロジェクション概要

概要

データセットプロジェクションは、大規模なクエリのパフォーマンスを向上できます。複数のクエリパターン向けにデータセットを最適化する場合(たとえば、2 列をフィルターするなど)、データセットにプロジェクションを追加することを考慮する必要があります。以下に、プロジェクションのユースケースの具体的な例を示しています。

各プロジェクションは通常、1 つのクエリパターンに対応し、列セットのフィルターまたは結合の向上に焦点を置いています。データセットには複数のプロジェクションを追加でき、プロジェクションではすべての列タイプが対応しています。また、プロジェクションはスナップショットにも、増分的にビルドしたデータセットにも追加できます。

プロジェクションには以下のような制限があります。

  • プロジェクションは追加のみのデータセットにしか追加できません。つまり、データセットに追加できるのは行だけで、ファイルやトランザクションはデータセットから手動で削除できません。プロジェクションシステムはこの要件に違反するデータセットを自動的に認識し、これらのプロジェクションを無効にしますが、ユーザーとしては、このシナリオは避ける必要があります。
  • プロジェクションは、列の追加など増分的に整合性のある操作でも、スキーマの進化には対応していません。

それぞれのユースケースにプロジェクションが適しているかどうかを確認するには、以下のユースケース例を確認してください。まず、プロジェクションの設定方法から確認してください。

ユースケース

プロジェクションは、多種多様なクエリタイプに有効です。以下にいくつかの例を挙げます。

  • 事前に指定した複数の次元で、大きなデータセットをフィルター処理する
  • 事前に指定した列セットで、大きなデータセットを結合する
  • 頻繁に書き込まれるインクルメンタル(差分処理)のデータセットまたはストリーミングデータセットから読み取る
  • アップロードしたデータから直接クエリする

列リストでのフィルター処理

順序を指定した列リストで、リストのいずれかのプレフィックスのフィルターを最適化します。プロジェクションは、列と定数値を比較するフィルターのみ高速化します。文字列のフィルターはすべて大文字と小文字を区別する必要があります。

たとえば、順序を指定した「["x", "y", "z"]」列のフィルターを最適化したプロジェクションは、 以下のタイプのクエリを高速化します。

  • SELECT * FROM dataset WHERE x = 5 AND y = 10 AND z = '15'
  • SELECT * FROM dataset WHERE x = 5 AND y = 10
  • SELECT * FROM dataset WHERE x = 5 AND q = 3
    • フィルター条件にANDで繋がれた他のカラムに対しての条件が含まれても問題ありません。

ただし、以下のタイプのクエリは最適化されません。

  • SELECT * FROM dataset WHERE abs(x) == 10
    • abs(x) == 10 は列を定数値と比較しません。
  • SELECT * FROM dataset WHERE x % 100 == 10
    • x % 100 == 10 は列を定数値と比較しません。
  • SELECT * FROM dataset WHERE y = 10
    • ["y"] は「["x", "y", "z"]」のプレフィックスではありません。
  • SELECT * FROM dataset WHERE z = '15'
    • ["z"] は「["x", "y", "z"]」のプレフィックスではありません。

範囲クエリ

プロジェクションは、以下の場合にフィルター列で範囲クエリを任意に高速化できます。

  • SELECT * FROM dataset WHERE x > 5 AND x < 10
  • SELECT * FROM dataset WHERE s LIKE 'SOME_PREFIX%'

制限事項

  • フィルター列の範囲クエリにも対応する、非プリミティブな列(例:配列)などを含むプロジェクションは 作成できません。

列セットでの結合

順序を指定していない列セットとバケットカウントでは、適切なセットとバケットカウントで結合(のみ)を最適化します。

たとえば、{"x", "y"} の結合に対して最適化されたプロジェクションは、以下のタイプのクエリを最適化します。

  • SELECT * FROM dataset1 INNER JOIN dataset2 ON dataset1.x = dataset2.x AND dataset1.y = dataset2.y

ただし、以下のクエリは最適化されません。

  • SELECT * FROM dataset1 INNER JOIN dataset2 ON dataset1.x = dataset2.x

プロジェクションされたデータセットとプロジェクションされていないデータセットの結合

Foundry では通常、大きなデータセットの結合にソートマージ結合を行います。この結合には、それぞれのデータセットをパーティションに分割することが含まれます。 パーティションへの分割は、結合キーに従って各パーティションをソートし、さらに同じキーを使って(ソートした)パーティションをマージすることで 行われます。

  • 一般的なケースでは、これは両方のデータセットをシャッフルして並べ替えることが含まれます。
  • 1 つのデータセットに、結合列への結合に最適化されたプロジェクションが含まれる場合は、シャッフルや並べ替えが 行われませんが、もう一方のデータセットでは行われます。
  • 両方のデータセットに、結合列への結合に最適化されたプロジェクションが含まれており、同じ数のバケット が使用されている場合は、どちらのデータセットにもシャッフルや並べ替えは行われません。これにより、パフォーマンスが大幅に向上します。これと 同じことが、(プロジェクションなしで)明示的にバケット化されたデータセットの結合に最適化されたデータセットの結合についても言えますが、 結合列とバケットの数は完全に一致している必要があります。

インクルメンタル(差分処理)パイプライン

インクルメンタル(差分処理)パイプラインは、結果としてファイル数が非常に多くなる場合があり、読み取りパフォーマンスはこれに呼応して低下します。たとえば、5 分間に 10 パーティションを記述するパイプラインがあるとすると、1 年間に 100 万個以上のファイルを記述することになります。これらは、単に入力パーティションのリストが作成されるなど、さまざまな理由から読み取りが困難です。

プロジェクションには、これらの透過性など、インクルメンタル(差分処理)パイプラインを圧縮する方法が用意されています。フィルターと結合のいずれかに最適化したプロジェクションを設定し、読み取りでプロジェクションを使用します。プロジェクションを使用したインクルメンタル(差分処理)パイプラインの詳細はこちら

アップロードされたデータ

複数の CSV から構成され、クエリを行う必要がある(フロントエンドのインポートなどからの)データセットが あるとします。ビルドを設定し、最適化したフォーマット(Parquet など)に変換できます。プロジェクションの追加は、もう 1 つの オプションです。データセットには引き続き元の CSV ファイルが含まれますが、読み取りでは最適化プロジェクションが使用されます。