我想了解spark 2.0如何適用於DataFrame API 作爲一個DataFrame,spark具有關於數據結構的知識。Spark SQL如何優化連接?什麼是優化技巧?
當加入大表到小表據我所知,廣播較小的表是一個好主意
然而到大表連接大表的時候,有什麼優化技巧有哪些?排序是否有幫助?或者會觸發內部排序?我應該何時對數據進行重新分區?
任何解釋將有助於
我想了解spark 2.0如何適用於DataFrame API 作爲一個DataFrame,spark具有關於數據結構的知識。Spark SQL如何優化連接?什麼是優化技巧?
當加入大表到小表據我所知,廣播較小的表是一個好主意
然而到大表連接大表的時候,有什麼優化技巧有哪些?排序是否有幫助?或者會觸發內部排序?我應該何時對數據進行重新分區?
任何解釋將有助於
免責聲明:我仍然在這方面的優化連接查詢,以便把它當作一粒鹽的新手。
星火SQL附帶有轉換邏輯加入到支持的連接物理運算符的一個JoinSelection執行規劃策略(每加入物理運算符的選擇要求)。
有6種不同類型的物理連接的運算符:
BroadcastHashJoinExec
向左或向右連接側可以廣播時(即,比spark.sql.autoBroadcastJoinThreshold
小,這是10M
默認情況下)
ShuffledHashJoinExec
時spark.sql.join.preferSortMergeJoin
被禁用,並且可以爲左側或右側聯接側(需求之間)構建散列映射圖
SortMergeJoinExec
左連接鍵時出現「訂購」
BroadcastNestedLoopJoinExec
當沒有加入鍵和左或右連接側可以廣播
CartesianProductExec
時,它的內部或無交叉加盟加盟條件
BroadcastNestedLoopJoinExec
在沒有其他具有匹配
正如你可以看到有很多的理論與二「有哪些優化技巧」。
排序是否有幫助?
是的。請參閱SortMergeJoinExec
運營商。
或者會觸發內部排序嗎?
它會嘗試,但人類可以(仍?)創造奇蹟。
什麼時候應該重新分區數據?
總是如果你能,並知道修剪可以幫助。這可以減少要處理的行數並且有效地允許BroadcastHashJoinExec
超過ShuffledHashJoinExec
或其他。
我還認爲,對數據進行重新分區對於基於成本的優化具有特別的幫助,其中表格修剪可以減少列和行的數量,並且反過來也可以減少表格大小和一個連接的成本。