SQL クエリで UDF がデカルト積を引き起こす理由
SQL を使用する場合、ユーザー定義関数 (UDF) によって予期しないパフォーマンスの問題が発生する可能性があります。これは結合操作で特に顕著であり、UDF が目的の完全外部結合ではなくデカルト積をもたらす可能性があります。
デカルト積の原因
UDF の使用には次のことが必要です。潜在的に無限の領域と非決定的な動作を伴う任意の関数の評価。これらの関数の値を決定するには、システムは考えられるすべての引数の組み合わせを考慮し、デカルト積を計算する必要があります。
例
指定された関数で提供される SQL クエリを考えてみましょう。 Databricks-Question:
-- Query 1: Join without UDF SELECT col1, col2 FROM table1 AS t1 JOIN table2 AS t2 ON t1.foo = t2.bar; -- Query 2: Join with UDF SELECT col1, col2 FROM table1 AS t1 JOIN table2 AS t2 ON equals(t1.foo, t2.bar);
クエリ 1 では、単純な等価条件によりデータ シャッフルが可能になります。 foo 列と bar 列に基づいて、期待どおりの結果が得られます。ただし、クエリ 2 では、イコール UDF を使用すると、すべての可能なペアの組み合わせに対して関数を評価する必要があり、結果としてデカルト積が得られます。
解決策
外部関数の強制デカルト積に対する結合は、通常、Spark SQL エンジンを変更しない限り不可能です。ただし、UDF 自体を最適化して評価の数を減らすと、パフォーマンスの低下の一部を軽減できる可能性があります。
以上がSQL 結合の UDF が予期した結合ではなくデカルト積を生成することがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。