PySpark与Delta版本兼容问题咨询:Docker环境运行报错
解决PySpark与Delta版本冲突导致的
AttributeError: module 'pyspark.sql.utils' has no attribute 'convert_exception'错误 问题根源
- Dockerfile环境变量配置无效:
RUN export命令仅在当前shell会话生效,后续步骤和容器运行时无法获取这些变量,导致Delta的Maven依赖未正确加载。 - Delta版本冲突:同时通过pip安装了
delta-spark==2.1.0,又在PYSPARK_SUBMIT_ARGS中指定了旧版本的delta-core_2.12:1.0.0,两个版本的Delta依赖冲突,破坏了PySpark的内部模块结构。 - 重复安装PySpark:
jupyter/pyspark-notebook镜像本身已预装PySpark,手动通过pip再次安装可能引发版本不一致问题。
修正方案
1. 调整requirements.txt
保留必要依赖,移除与镜像预装组件冲突的包,确保Delta与PySpark版本匹配:
delta-spark==2.1.0 deltalake==0.10.1 jupyterlab==4.0.6 pandas==2.1.0 # 移除pyspark,使用镜像预装版本;若需指定版本,确保与镜像版本一致
2. 修正Dockerfile
- 使用
ENV设置全局环境变量,确保容器运行时能读取到Delta的Maven依赖 - 统一Delta版本,使用与
delta-spark==2.1.0对应的Maven坐标 - 简化用户权限配置(原镜像已默认使用jovyan用户,无需重复配置)
修改后的Dockerfile:
FROM jupyter/pyspark-notebook USER root COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt && rm requirements.txt # 设置Delta对应的Maven依赖和PySpark提交参数 ENV PACKAGES="io.delta:delta-core_2.12:2.1.0,io.delta:delta-storage_2.12:2.1.0" ENV PYSPARK_SUBMIT_ARGS="--packages ${PACKAGES} pyspark-shell" USER ${NB_USER}
3. 验证步骤
- 重新构建镜像:
docker-compose build
- 启动容器:
docker-compose up
- 在Notebook中测试Delta初始化代码:
from pyspark.sql import SparkSession from delta.tables import DeltaTable spark = SparkSession.builder \ .appName("DeltaTest") \ .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \ .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \ .getOrCreate() # 创建测试Delta表 data = spark.range(0, 5) data.write.format("delta").save("/tmp/delta-table") # 读取Delta表 delta_table = DeltaTable.forPath(spark, "/tmp/delta-table") delta_table.toDF().show()
关键说明
delta-spark的Maven依赖版本必须与pip包版本完全一致,否则会出现类加载冲突jupyter/pyspark-notebook镜像的PySpark版本需与delta-spark兼容:delta-spark==2.1.0对应Spark 3.3.x,若镜像预装版本不符,可在requirements.txt中指定pyspark==3.3.3确保版本一致- 避免同时通过pip和Maven两种方式引入Delta依赖,选择一种即可(推荐使用
delta-sparkpip包配合对应Maven坐标)
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

