2017-06-08 85 views
3

我想了解spark 2.0如何適用於DataFrame API 作爲一個DataFrame,spark具有關於數據結構的知識。Spark SQL如何優化連接?什麼是優化技巧?

  1. 當加入大表到小表據我所知,廣播較小的表是一個好主意

  2. 然而到大表連接大表的時候,有什麼優化技巧有哪些?排序是否有幫助?或者會觸發內部排序?我應該何時對數據進行重新分區?

任何解釋將有助於

回答

0

免責聲明:我仍然在這方面的優化連接查詢,以便把它當作一粒鹽的新手。


星火SQL附帶有轉換邏輯加入到支持的連接物理運算符的一個JoinSelection執行規劃策略(每加入物理運算符的選擇要求)。

有6種不同類型的物理連接的運算符:

  1. BroadcastHashJoinExec向左或向右連接側可以廣播時(即,比spark.sql.autoBroadcastJoinThreshold小,這是10M默認情況下)

  2. ShuffledHashJoinExecspark.sql.join.preferSortMergeJoin被禁用,並且可以爲左側或右側聯接側(需求之間)構建散列映射圖

  3. SortMergeJoinExec左連接鍵時出現「訂購」

  4. BroadcastNestedLoopJoinExec當沒有加入鍵和左或右連接側可以廣播

  5. CartesianProductExec時,它的內部或無交叉加盟加盟條件

  6. BroadcastNestedLoopJoinExec在沒有其他具有匹配

正如你可以看到有很多的理論與二「有哪些優化技巧」

排序是否有幫助?

是的。請參閱SortMergeJoinExec運營商。

或者會觸發內部排序嗎?

它會嘗試,但人類可以(仍?)創造奇蹟。

什麼時候應該重新分區數據?

總是如果你能,並知道修剪可以幫助。這可以減少要處理的行數並且有效地允許BroadcastHashJoinExec超過ShuffledHashJoinExec或其他。

我還認爲,對數據進行重新分區對於基於成本的優化具有特別的幫助,其中表格修剪可以減少列和行的數量,並且反過來也可以減少表格大小和一個連接的成本。