因為要上線一個需求,有改到spark sql。 在改之前我一般習慣把生產原邏輯跑一邊理解下(需求趕,都是邊讀業務邊寫)
但奇怪的是,在生產上已經跑了24個賬期的代碼,拉到自己環境跑卻報了 兩者的版本都是2.X
Detected cartesian product for INNER join between logical plans的錯誤。
這個錯誤很明顯,笛卡爾積。
國內所有的解決方案都是抄襲的
設置 配置 spark.conf.set("spark.sql.crossJoin.enabled", "true") 這個在2.X是默認關閉的。
但是!我去生產上spark.conf.get("spark.sql.crossJoin.enabled") 一下,得到的結果是false, 說明生產上也是沒開啟的。而且開啟這個在許多情況下是不建議的,極度消耗性能。
於是我就跑去外面問問老外是怎么解決了。

很顯然,這位老兄遇到了和我同樣的問題。

REPORT_X 都是列僅包含單個值,優化器此時無法推斷連接列僅包含單個值,並將嘗試應用散列或排序合並連接。
說明正常情況下,這串代碼理應報笛卡爾積連接問題。但是為什么生產上沒有呢。
我就想到了是否是版本問題。結果一查!正是!

剛好因為版本的問題,雖然在1.X默認開啟,2.X默認關閉,但是2.X之間似乎還說會有細微的差別。
至此,問題解決。暫定是版本問題。
