为什么 UDF 会导致 SQL 查询中的笛卡尔积
使用 SQL 时,用户定义函数 (UDF) 可能会引入意外的性能问题。这在连接操作中尤其明显,其中 UDF 可能导致笛卡尔积,而不是所需的完全外连接。
笛卡尔积的原因
使用 UDF 是必要的具有潜在无限域和非确定性行为的任意函数的评估。要确定这些函数的值,系统必须考虑所有可能的参数组合,从而产生笛卡尔积。
示例
考虑给定中提供的 SQL 查询Databricks-问题:
-- 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 中,使用 equals UDF 需要评估所有可能的对组合的函数,从而产生笛卡尔积。
解决方案
强制使用外部如果不修改 Spark SQL 引擎,通常不可能通过笛卡尔积进行连接。然而,优化 UDF 本身以减少评估次数可以缓解部分性能下降。
以上是为什么 SQL 连接中的 UDF 有时会产生笛卡尔积而不是预期的连接?的详细内容。更多信息请关注PHP中文网其他相关文章!