我正在使用 spark 版本 3.0.1。我正在生成一個大型資料框。在結束計算時,我以 json 格式保存資料框計劃。我需要他。但是有一個問題。如果我堅持一個 DataFrame,那么它的 json 格式的計劃將被完全截斷。也就是說,所有資料沿襲都消失了。
例如,我這樣做:
val myDf: DataFrame = ???
val myPersistDf = myDf.persist
//toJSON method cuts down my plan
val jsonPlan = myPersistDf.queryExecution.optimizedPlan.toJSON
因此,僅保留有關當前列的資訊。但是比如你使用spark 3.1.2版本,那么就沒有這個問題了。也就是說,計劃沒有被削減。還值得一提的是,如果不呼叫 toJSON 方法,那么計劃就沒有被削減:
// Plan is not being cut.
val textPlan = myPersistDf.queryExecution.optimizedPlan.toString
我做了一個小測驗專案來確保這一點:

請幫我弄清楚。我需要以 json 格式獲取完整計劃。
更新(1):
現在我正在嘗試將每個節點分別轉換為 json。現在它并不完美,但我認為我們需要朝這個方向發展。
val jsonPlan = s"[${getJson(result_df.queryExecution.optimizedPlan).mkString(",")}]"
def getJson(lp: TreeNode[_]): Seq[String] = {
val children = (lp.innerChildren lp.children.map(c => c.asInstanceOf[TreeNode[_]])).distinct
JsonMethods.compact(JsonMethods.render(JsonMethods.parse(lp.toJSON)(0))) :
getJson(t.asInstanceOf[TreeNode[_]])))
children.flatMap(t => getJson(t))
}
更新(2):
好的,這就是我最終解決這個問題的方法。我從 github 下載了 spark 3.0.1。然后用 spark 3.1.2 中的檔案替換了這個專案中的 TreeNode 類。重新編譯專案。結果,我收到了一個包 spark-catalyst_2.12-3.0.1.jar,它替換了現有的原始包裝。
沒有選項可以切換到另一個版本的 spark。我還沒有找到任何其他解決方案。謝謝各位大神指點。你的建議有幫助。
uj5u.com熱心網友回復:
您可以選擇以下 2 個提交到 spark 3.0.1 來解決此問題。
* 1603775934 - [SPARK-35411][SQL][FOLLOWUP] Handle Currying Product while serializing TreeNode to JSON (8 months ago) <Tengfei Huang>
* 9804f07c17 - [SPARK-35411][SQL] Add essential information while serializing TreeNode to json (9 months ago) <Tengfei Huang>
uj5u.com熱心網友回復:
好吧,你已經有點答案了。
TLDR:升級。
您可以,可以,查看邏輯計劃代碼的github 存盤庫,并尋找邏輯計劃計算方式之間的差異。3.0.1 和 3.1.2。(或者查看persist 的代碼,看看它是如何變化的。)然后您可以將補丁移植到3.0.1。但是您仍然需要構建新版本的 spark,然后部署它,以便恢復計劃。但是,如果您正在做所有這些作業,為什么不升級到 3.1.2,如果您知道它可以作業?(或者一些更高版本的 Spark?)
(您必須對僅與 3.0.1 兼容的子組件有一些依賴?)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424064.html
