PySpark写入Avro遇SQLConf相关类/方法缺失错误求助
问题排查:PySpark写入Avro时的依赖版本冲突问题
错误现象
- 使用PySpark 3.5.3执行Avro写入时,抛出
java.lang.NoClassDefFoundError,提示找不到org/apache/spark/sql/internal/SQLConf$LegacyBehaviorPolicy$类 - 降级至PySpark 3.3.4后,抛出
java.lang.NoSuchMethodError,提示找不到SQLConf$.LEGACY_AVRO_REBASE_MODE_IN_WRITE()方法
问题根源
两个错误均由Spark核心版本与Avro依赖包版本不匹配、环境中存在冲突依赖导致:
- Spark 3.5.3的Avro包依赖3.5.x版本的Spark核心类,若环境中存在旧版Spark核心Jar,会触发类找不到的错误;
- Spark 3.3.x中尚未引入
LEGACY_AVRO_REBASE_MODE_IN_WRITE方法,Avro包3.3.4调用不存在的方法,说明环境中可能混合了高版本Avro类,或依赖版本不对应。
修复方案
1. 严格保持Spark与Avro依赖版本一致
spark-avro的版本必须和PySpark版本完全相同,同时确保Hadoop相关依赖版本兼容:
- 若使用PySpark 3.5.3,依赖配置改为:
.config("spark.jars.packages", "org.apache.spark:spark-avro_2.12:3.5.3,org.apache.hadoop:hadoop-azure:3.3.4,com.microsoft.azure:azure-storage:8.6.0")
- 若使用PySpark 3.3.4,依赖配置保持如下(已匹配版本):
.config("spark.jars.packages", "org.apache.spark:spark-avro_2.12:3.3.4,org.apache.hadoop:hadoop-azure:3.3.4,com.microsoft.azure:azure-storage:8.6.0")
2. 清理本地冲突缓存Jar
删除本地Ivy缓存目录下的旧版本Spark、Avro、Hadoop相关Jar,避免版本混合:
- Windows路径:
C:/Users/losjfg/.ivy2/jars/,删除后重新运行程序,让Ivy自动拉取匹配的依赖包。
3. 排查环境中的额外依赖
确保运行环境中没有手动添加的其他Spark或Avro Jar包,避免类加载优先级冲突。
原始代码与环境信息
初始代码(PySpark 3.5.3)
spark = pyspark.sql.SparkSession.builder\ .master("local[*]")\ .appName("MiAplicacionSpark")\ .config("spark.jars.packages", "org.apache.spark:spark-avro_2.12:3.5.3,org.apache.hadoop:hadoop-azure:3.2.0,com.microsoft.azure:azure-storage:8.6.0") \ .getOrCreate() ... df = spark.read \ .format("jdbc") \ .option("url", jdbc_url) \ .option("dbtable", query) \ .option("user", username) \ .option("password", password) \ .option("fetchsize", "20000") \ .load() df.write.format("avro").mode("overwrite").save(file_path + "_magic.avro")
降级后的依赖配置(PySpark 3.3.4)
.config("spark.jars.packages", "org.apache.spark:spark-avro_2.12:3.3.4,org.apache.hadoop:hadoop-azure:3.3.4,com.microsoft.azure:azure-storage:8.6.0") \
环境信息
- Java版本:11.0.16.1
- Spark版本:3.3.4
- 已加载的Jars列表:
- file:///C:/Users/losjfg/.ivy2/jars/org.apache.hadoop_hadoop-azure-3.3.4.jar
- file:///C:/Users/losjfg/.ivy2/jars/com.microsoft.azure_azure-storage-8.6.0.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.apache.httpcomponents_httpclient-4.5.13.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.apache.hadoop.thirdparty_hadoop-shaded-guava-1.1.1.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.eclipse.jetty_jetty-util-ajax-9.4.43.v20210629.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.codehaus.jackson_jackson-mapper-asl-1.9.13.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.codehaus.jackson_jackson-core-asl-1.9.13.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.wildfly.openssl_wildfly-openssl-1.0.7.Final.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.apache.httpcomponents_httpcore-4.4.13.jar
- file:///C:/Users/losjfg/.ivy2/jars/commons-logging_commons-logging-1.1.3.jar
- file:///C:/Users/losjfg/.ivy2/jars/commons-codec_commons-codec-1.15.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.eclipse.jetty_jetty-util-9.4.43.v20210629.jar
- file:///C:/Users/losjfg/.ivy2/jars/com.fasterxml.jackson.core_jackson-core-2.9.4.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.slf4j_slf4j-api-1.7.12.jar
- file:///C:/Users/losjfg/.ivy2/jars/org.apache.commons_commons-lang3-3.4.jar
- file:///C:/Users/losjfg/.ivy2/jars/com.microsoft.azure_azure-keyvault-core-1.0.0.jar
- file:///C:/Users/losjfg/.ivy2/jars/com.google.guava_guava-20.0.jar
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

