從任務中呼叫Java/Scala 函數
嘗試在映射轉換中使用PySpark 的DecisionTreeModel.predict 函數時,通常會出現異常遭遇。此錯誤源自於以下事實:Py4J(促進 Python 和 Java 之間的通訊)只能從驅動程式存取。
文件建議透過將預測和標籤分離為不同的映射操作來避免此問題。然而,這個解決方案提出了是否有更優雅的方法的問題。
JavaModelWrapper 和 Py4J
PySpark 的 Python 解釋器透過套接字與 JVM 工作執行緒通信,將它們與驅動程式上存在的 Py4J 閘道。此限制阻止使用者直接存取 Java/Scala 函數。
替代解決方案
儘管有通訊限制,但仍有多種解決方法:
1. Spark SQL 資料來源API
此進階API 允許使用者將JVM 程式碼封裝在Spark SQL 資料來源中。雖然受支持,但它有點冗長並且缺乏全面的文檔。
2.帶有 DataFrame 的 Scala UDF
Scala UDF 可以應用於 DataFrame,提供簡單的實作以及與現有 DataFrame 資料結構的相容性。但是,這種方法需要存取 Py4J 和內部方法。
3. Scala 接口
可以建立自訂 Scala 接口,鏡像 MLlib 模型包裝器方法。這提供了靈活性和執行複雜程式碼的能力,但需要資料轉換和內部 API 存取。
4.外部工作流程管理
可以使用Alluxio等工具來促進Python和Scala/Java任務之間的資料交換,最大限度地減少對原始程式碼的更改,但可能會產生資料傳輸成本。
5.共享 SQLContext
互動式分析可以受益於共享 SQLContext,並透過註冊的臨時表實現資料共享。然而,批次作業或編排要求可能會限制其適用性。
結論
雖然Py4J 通訊限制阻礙了分散式PySpark 任務中直接存取Java/Scala 函數,但所提出的解決方法提供了不同程度的靈活性和技術挑戰。方法的選擇最終取決於用例的特定要求和約束。
以上是如何從 PySpark 任務呼叫 Java/Scala 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!