Azure Synapse Notebook导入delta-spark报ModuleNotFoundError求助
ModuleNotFoundError: No module named 'pyspark.errors'的解决方法 问题描述
在Azure Synapse Notebook中尝试导入delta-spark包时触发ModuleNotFoundError: No module named 'pyspark.errors'错误。已确认delta-spark和pyspark包均已安装,且pyspark.sql.functions等基础模块能正常导入,但导入DeltaTable时因依赖pyspark.errors失败。相同版本的包在Databricks Notebook中可正常运行,尝试使用findspark未解决问题,推测是pyspark子包缺失而非pyspark本身的问题。
环境与代码信息
安装命令及输出
%pip install delta-spark
输出节选:
Requirement already satisfied: delta-spark in /nfs4/pyenv-fee9cba1-d59a-44ab-8b9e-957614b27f23/lib/python3.10/site-packages (3.0.0) Requirement already satisfied: pyspark<3.6.0,>=3.5.0 in /nfs4/pyenv-fee9cba1-d59a-44ab-8b9e-957614b27f23/lib/python3.10/site-packages (from delta-spark) (3.5.0)
导入代码及报错
import pyspark.sql.functions as F from pyspark.sql import Window from delta.tables import DeltaTable
输出节选:
--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In [9], line 10 8 import pyspark.sql.functions as F 9 from pyspark.sql import Window ---> 10 from delta.tables import DeltaTable ... File ~/cluster-env/env/lib/python3.10/site-packages/delta/exceptions.py:20 17 from typing import TYPE_CHECKING, Optional 19 from pyspark import SparkContext ---> 20 from pyspark.errors.exceptions import captured 21 from pyspark.errors.exceptions.captured import CapturedException 22 from pyspark.sql.utils import ( 23 AnalysisException, 24 IllegalArgumentException, 25 ParseException 26 ) ModuleNotFoundError: No module named 'pyspark.errors'
Spark池环境配置
SPARK_HOME -> /opt/spark PYTHONPATH -> /opt/spark/python/lib/pyspark.zip<CPS>/opt/spark/python/lib/py4j-0.10.7-src.zip<CPS>/opt/spark/python/lib/pyspark.zip<CPS>/opt/spark/python/lib/py4j-0.10.7-src.zip
原因分析
delta-spark 3.0.0要求依赖pyspark 3.5.0及以上版本,而pyspark.errors模块是在Spark 3.4版本后引入的。从Spark池的PYTHONPATH配置可以看出,运行时优先加载集群自带的pyspark(路径为/opt/spark),其版本大概率低于3.5.0,导致pip安装的高版本pyspark未被优先加载,从而找不到pyspark.errors模块。
解决方案
1. 升级Spark池版本
检查Azure Synapse Spark池的Spark版本,如果低于3.5.0,直接将Spark池升级到3.5.0及以上版本,确保集群自带的pyspark版本满足delta-spark的依赖要求。
2. 调整PYTHONPATH优先级
在Notebook开头添加以下代码,将pip安装的pyspark路径放到sys.path最前面,确保优先加载正确版本的pyspark:
import sys import os # 获取pip安装的pyspark所在路径(根据实际环境调整) pip_pyspark_path = "/nfs4/pyenv-fee9cba1-d59a-44ab-8b9e-957614b27f23/lib/python3.10/site-packages/pyspark" # 插入到路径最前方 sys.path.insert(0, pip_pyspark_path)
3. 通过集群库管理安装delta-spark
避免用户环境与集群环境的版本冲突,直接通过Azure Synapse的Spark池库管理功能安装delta-spark包,系统会自动匹配兼容的版本,确保与集群Spark版本一致。
内容的提问来源于stack exchange,提问作者Veronika Vrana

