簡體   English   中英

Pyspark and using UDFs: How to Pass Python Arguments (sys.argv, argparse) to Python Worker?

[英]Pyspark and using UDFs: How to Pass Python Arguments (sys.argv, argparse) to Python Worker?

我使用 Spark 3.0.1 和 Python 3.6.8 通過 spark-submit 作為獨立應用程序運行腳本:

spark-submit [spark-confs]  pyspark-script.py --args1 val1 --args2 val2

並且腳本運行良好。 使用 argparse 我可以獲取 args1 和 args2,但是,當我在腳本中引入 UDF 時:

   my_udf = udf(lambda x: my_func(x))
   df = df.withColumn(cat, my_udf(cat))

我收到以下錯誤:

pyspark.sql.utils.PythonException:
  An exception was thrown from the Python worker. Please see the stack trace below.
Traceback (most recent call last):
  File "/opt/zoran/python-3.6/lib/python3.6/site-packages/pyspark-script.py", line 24, in main
    with open(args.args1) as f:
TypeError: expected str, bytes or os.PathLike object, not NoneType

我注意到我的 arguments 停止被拾取。 我通過硬編碼 arg1 和 arg2 的值來確認這一點,並且它像以前一樣工作。

問題是,如何將 python arguments 傳遞給底層的 Python Worker?

此外,引入使 PySpark 行為如此的 UDF 會發生什么?

編輯:有一個 init_config() 調用發生在主腳本之外。 它沒有包含在if __name__ == '__main__'中,因此它會被自動調用並且它被設計為被調用一次。 但是,(1)它被 Python Worker 以某種方式再次調用,它(2)出錯,因為它無法訪問參數。

文檔說明了應用程序參數

Arguments 傳遞給你的主 class 的主方法,如果有的話

這意味着 arguments 僅在 Spark 驅動程序的上下文中可用。 由於 udf 在遠程 Python 進程中的遠程執行程序上執行,因此它們無法訪問 arguments。

將 arguments 傳輸到執行程序進程的一種方法是使用廣播

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM