PySpark写入Delta报错ClassNotFoundException: delta.DefaultSource
报错根因
这个java.lang.ClassNotFoundException: delta.DefaultSource报错核心是两类问题导致的:
- 版本不兼容:你当前使用的Spark版本是3.2.1,但配置中引入的Delta依赖是
io.delta:delta-core_2.12:0.7.0,该版本仅适配Spark 3.0及更早版本,和Spark 3.2完全不兼容,运行时自然找不到Delta数据源的实现类。 - 依赖未实际加载:Jupyter Notebook环境下,如果在执行创建SparkSession的代码前,已经有其他操作提前初始化了Spark上下文,那么代码中写的
spark.jars.packages配置不会生效,Delta依赖包根本没有被拉取加载到执行环境中,也会触发类找不到的错误。
排查与修复步骤
- 第一步先替换适配的Delta版本:Spark 3.2.x对应兼容的Delta版本为2.0.x,直接将依赖配置修改为
io.delta:delta-core_2.12:2.0.1即可,不要使用0.7.0这类过旧的版本。修正后的核心代码参考:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .master("local[*]") \ .appName('test') \ .config("spark.jars.packages", "io.delta:delta-core_2.12:2.0.1") \ .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \ .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \ .config('spark.ui.port', '4050') \ .getOrCreate() df = spark.read.format('parquet').load('fhvhv_tripdata_2021-01.parquet') df.write.format('delta').save('deltafiles')
- 如果替换版本后仍报错,先执行
print(spark.sparkContext.getConf().getAll())打印当前所有生效的Spark配置,确认spark.jars.packages配置项的值确实是你设置的正确Delta依赖,没有被全局环境变量或其他预配置覆盖。 - 检查是否存在提前初始化Spark的问题:重启Jupyter内核后,直接运行创建SparkSession的代码块,不要先执行其他会触发PySpark初始化的操作,避免自定义的依赖配置失效。
- 如果是网络原因导致Maven无法自动拉取Delta依赖,可以手动下载对应版本的delta-core jar包到本地,通过
spark.jars配置指定本地jar的绝对路径,绕过自动拉取的流程。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

