2015-10-05 44 views
0

我看到Databricks-Question和不理解为什么在SQL查询中使用UDF导致笛卡尔积?

  1. 为什么使用UDF的导致笛卡尔乘积,而不是一个完整的外部联接?很明显,笛卡尔产品比全外连接(Joins就是一个例子)要多得多,这是潜在的性能 命中。
  2. Databricks-Question中给出的示例中,强制笛卡尔乘积的外连接的方法是?

引述Databricks-Question这里:

我有一个使用SQLContext执行对数据流 SQL语句星火流应用。当我在 Scala中注册一个自定义UDF时,流应用程序的性能显着下降 。

声明1::下面详细

Select col1, col2 from table1 as t1 join table2 as t2 on t1.foo = t2.bar

声明2:

Select col1, col2 from table1 as t1 join table2 as t2 on equals(t1.foo,t2.bar)

我注册使用SQLContext定制UDF如下:

sqlc.udf.register("equals", (s1: String, s2:String) => s1 == s2)

对于相同的输入和Spark配置,与Statement1相比,Statement2的性能 明显更差(接近100X)。

回答

5

为什么使用UDF导致笛卡尔乘积而不是完全外连接?

使用UDF需要笛卡尔积的原因很简单。既然你传递了一个具有无限域和非确定性行为的任意函数,唯一确定其值的方法是传递参数并进行评估。这意味着你只需要检查所有可能的配对。

从另一方面简单的平等有一个可预测的行为。如果使用t1.foo = t2.bar条件,则可以简单地按和t2行分别按foobar来获得预期结果。

准确地说,在关系代数外连接实际上是使用自然连接表示的。除此之外的任何事情都只是一种优化。

任何方式强制执行外连接在笛卡尔乘积

不是真的,除非你想修改星火SQL引擎。