我遇到以下錯誤當我運行在databricks-connect模型擬合過程。
它看起來像工人節點無法從項目的父目錄訪問模塊。
注意,程序運行成功到目前為止;沒有模塊沒有找到錯誤的開始和火花的行動很好的運行直到這個收集聲明。也,我打包我的項目作為一個輪直接安裝在集群上以確保模塊是可用的工人。
我有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模型分布在工作節點。錯誤後提出一些子流程執行火花命令成功地在工人。
有些事情我試過/驗證:
@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..。