2015-10-05 43 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引擎。