我有一個簡單的火花SQL查詢:如何在執行前更改查詢計劃(可能會關閉優化)?
SELECT x, y
FROM t1 INNER JOIN t2 ON t1.key = t2.key
WHERE expensiveFunction(t1.key)
凡expensiveFunction
是火花UDF(用戶定義函數)。
當我看到火花生成的查詢計劃,我看到它有兩個過濾操作而不是隻有一個:它檢查不僅expensiveFunction(t1.key)
,也expensiveFunction(t2.key)
。
一般情況下,這種優化是不是一件壞事,因爲它減少的記錄加入的數量,並加入是昂貴的操作。但在我的情況下,expensiveFunction(t2.key)
總是返回true,所以我想刪除它。
有沒有辦法在執行查詢之前更改查詢計劃?有沒有一種方法可以指示我不希望給定的優化應用於我的查詢?
另存爲一個單獨的數據框不起作用,我試了一下。數據框是懶惰的對象,查詢規劃者可以訪問它們的依賴關係。我打算用子查詢來嘗試它,但我認爲優化器無論如何都會看到可能的優化。 – lovasoa
在單獨的數據框中,您將調用persist()方法。如果你調用的方法堅持數據幀評估是強制的,然後你可以加入這個持久數據框與其他數據框,你加入查詢將沒有提及'expensiveFunction'功能 –
這是一個好主意,並且確實防止火花執行不需要的優化。但是,它會增加持續存儲大數據集的成本,然後立即讀取它...因此,如果有人知道如何直接從查詢計劃器禁用優化,我很樂意聽到它。 – lovasoa