SQL クエリとデカルト積の UDF
SQL クエリでユーザー定義関数 (UDF) を使用すると、デカルト積が生成される可能性があります意図した完全外部結合の代わりに。デカルト積は、1 つのテーブルのすべての行が別のテーブルのすべての行と結合されるときに発生し、完全外部結合よりもはるかに大きなデータセットが生成されます。
UDF によってデカルト積が発生するのはなぜですか?
UDF では、クエリ エンジンによる最適化を妨げるさらなる複雑さのレベルが導入されます。 UDF は、非決定的な動作を持つ任意の数の引数を受け入れることができます。考えられるすべての行の組み合わせに対して UDF を評価するには、クエリ エンジンはデカルト積を実行する必要があります。
対照的に、列間の単純な等価比較 (例: t1.foo = t2.bar) は予測可能な動作をします。 。クエリ エンジンはこれを使用して、foo 列と bar 列に基づいて行をシャッフルすることで結合を最適化し、デカルト積の必要性を回避できます。
外部結合の強制
残念ながら、上記の例ではデカルト積に対して外部結合を強制する簡単な方法はありません。唯一のオプションは、Spark SQL エンジンを変更することです。
上で説明したように、デカルト積は UDF の任意で非決定的な性質の結果です。クエリ エンジンは、追加の制約を導入せずにそれらを最適化することはできません。
以上がSQL クエリの UDF が外部結合ではなくデカルト積を生成する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。