PySpark调用erfinv自定义UDF报scipy模块未找到错误求助
PySpark调用erfinv报错问题解答
报错原因
报错核心原因是PySpark的UDF执行在集群的Executor节点而非任务提交的Driver节点,你本地Driver环境安装了scipy只能保证本地单进程代码正常运行,只要集群Executor节点的Python环境未安装scipy,UDF执行时就会触发ModuleNotFoundError: No module named 'scipy'错误。
解决方法
- 方案1:集群运维层面统一给所有Executor节点的对应Python环境安装scipy,注意保持和Driver端的Python版本、scipy版本一致,避免出现版本兼容问题。
- 方案2:如果没有权限修改集群节点环境,可以使用PySpark的依赖分发能力,将scipy打包后随任务提交:提交任务时通过
--py-files参数传入打包好的依赖,或者用spark.archives配置传递带scipy的conda虚拟环境压缩包,让Executor运行时加载你指定的依赖环境。 - 方案3:若使用Spark 3.0及以上版本,可直接调用Spark内置的
erfinv函数,无需自定义UDF引入scipy,性能更高也不存在依赖问题,示例代码如下:
import pyspark.sql.functions as F # 直接用内置函数替换自定义UDF df1 = df.withColumn('prob', F.sqrt(F.lit(2)) * F.erfinv(F.col('value') * 2 - 1))
内容的提问来源于stack exchange,提问作者Amy Jack
相关产品推荐
相关产品推荐

