SQL 查询中的 UDF 和笛卡尔积
在 SQL 查询中使用用户定义函数 (UDF) 可能会导致笛卡尔积而不是预期的完整外连接。当一个表中的所有行与另一个表中的所有行组合时,就会出现笛卡尔积,从而产生比完全外连接大得多的数据集。
为什么 UDF 会导致笛卡尔积?
UDF 引入了额外的复杂性,阻碍了查询引擎的优化。 UDF 可以接受任意数量的具有非确定性行为的参数。要评估所有可能的行组合的 UDF,查询引擎必须执行笛卡尔积。
相反,列之间的简单相等比较(例如 t1.foo = t2.bar)具有可预测的行为。查询引擎可以使用它通过根据 foo 和 bar 列打乱行来优化连接,从而避免使用笛卡尔积。
强制外部联接
不幸的是,在上面的示例中,没有直接的方法可以对笛卡尔积强制进行外部联接。唯一的选择是修改 Spark SQL 引擎。
如上所述,笛卡尔积是 UDF 的任意性和非确定性性质的结果。如果不引入额外的约束,查询引擎就无法优化它们。
以上是为什么 SQL 查询中的 UDF 有时会生成笛卡尔积而不是外连接?的详细内容。更多信息请关注PHP中文网其他相关文章!