取消
顯示的結果
而不是尋找
你的意思是:

在databricks-connect ModuleNotFoundError / SerializationError時執行

至今為止
新的因素

我遇到以下錯誤當我運行在databricks-connect模型擬合過程。

modulenotfoundanno它看起來像工人節點無法從項目的父目錄訪問模塊。

注意,程序運行成功到目前為止;沒有模塊沒有找到錯誤的開始和火花的行動很好的運行直到這個收集聲明。也,我打包我的項目作為一個輪直接安裝在集群上以確保模塊是可用的工人。

我有python項目設置如下:

optimize-assortments

| -配置/

| -測試/

| -optimize_assortments /

| - - - - - -process.py

| - sub_process_1.py

| - sub_process_2.py

| - sub_process_3.py

process.py從每個sub_process module_1,進口類實例化並運行他們的方法。他們是一組火花轉換以及熊貓UDF,這符合sci-kit模型分布在工作節點。錯誤後提出一些子流程執行火花命令成功地在工人。

有些事情我試過/驗證:

  • Python / DBR / db-connect版本。
  • 將所有代碼從sub_module到父進程。
  • 建立一個輪安裝在我的集群:
    • 通過運行databricks-connect給我ModuleNotFoundError中途執行如上所述。
    • 如果我從在導入模塊/子模塊磚筆記本,成功執行的代碼。
3回複3

DouglasLinder
新的貢獻者三世

@Sarosh艾哈邁德,你還沒有提供所有的細節,但問題是如此接近一個我見過過去,我相當肯定的是相同的問題。

長話短說:當執行程序執行一個UDF,,不管你注冊的函數,嚐試執行函數使用一個完全限定的名稱空間。

也就是說,如果你創建一個文件像optimize_assortments /foo.py:

def hello ():……hello_udf = udf(你好,StringType ()) df =(火花。sql (“SELECT * FROM foo”)。withColumn('你好',hello_udf ()))

然後火花optimize_assortments.foo執行人將嚐試執行”。你好'這是沒有定義的,可怕的ModuleNotFoundError將拋出。

這是因為“你好”的函數作用域模塊中定義。

你可以解決這個問題通過定義一個函數級別UDF沒有範圍,因此解析為“你好”當它被調用時,像這樣:

def run (): def你好():……hello_udf = udf(你好,StringType ()) df =(火花。sql (“SELECT * FROM foo”)。withColumn('你好',hello_udf ()))

很多人會推薦這種方法的原因很多,但主要是他們不知道為什麼。

原因是當你定義一個函數內部一個函數,它不是模塊範圍,因此沒有模塊名稱空間。

這段代碼將正常工作在一個筆記本(而不是磚連接),因為筆記本電腦使用一個頂級(即。沒有命名空間)模塊範圍。

我試圖解釋,但是你可以閱讀更多,看到一個完整的堆棧溢出的詳細例子- >https://stackoverflow.com/questions/59322622/how-to-use-a-udf-defined-in-a-sub-module-in-pyspark/671..。

希莫
新的貢獻者三世
新的貢獻者三世

@Sarosh艾哈邁德,你能嚐試添加模塊的zip addPyFile像下麵

spark.sparkContext.addPyFile (“src.zip”)

Kaniz
社區經理
社區經理

嗨@Sarosh艾哈邁德,隻是一個友好的後續。你還需要幫助或上述反應幫助你找到解決方案了嗎?請讓我們知道。

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map