PySpark 3.5.0读取Avro文件时遭遇AbstractMethodError错误求助
PySpark 3.5.0读取Avro文件时遭遇AbstractMethodError错误求助
我刚碰到过一模一样的问题,结合你的环境信息和报错内容,帮你分析一下原因和解决办法:
你的环境与操作
- Spark版本:3.5.0
- Python版本:3.8(从报错路径里的
anaconda3/lib/python3.8可以推断) - 启动PySpark的命令:
pyspark --packages org.apache.spark:spark-avro_2.13:3.5.0 - 执行的代码:
from pyspark.sql import SparkSession spark=SparkSession.builder.appName('test-app').getOrCreate() df=spark.read.format('avro').load('twitter.avro')
核心错误
你遇到的AbstractMethodError关键内容是:
java.lang.AbstractMethodError: Receiver class org.apache.spark.sql.avro.AvroFileFormat does not define or inherit an implementation of the resolved method 'abstract scala.Option inferSchema(org.apache.spark.sql.SparkSession, scala.collection.immutable.Map, scala.collection.Seq)' of interface org.apache.spark.sql.execution.datasources.FileFormat.
问题根源
这个错误几乎都是Spark的Scala版本与你指定的Avro包Scala版本不匹配导致的。虽然你用了spark-avro_2.13:3.5.0,但你的Spark安装包可能默认是基于Scala 2.12编译的,两者不兼容就会出现这种方法找不到的错误。
解决方案
试试下面几个步骤,按顺序来:
1. 先确认你的Spark对应的Scala版本
打开PySpark交互式环境,执行以下代码:
print(spark.sparkContext._jvm.scala.util.Properties.versionString())
如果输出是version 2.12.x,那你需要改用对应Scala 2.12的Avro包启动PySpark:
pyspark --packages org.apache.spark:spark-avro_2.12:3.5.0
如果是2.13.x,那继续往下看。
2. 在SparkSession中直接配置依赖
有时候启动命令的包加载会有缓存或者冲突问题,试试在创建SparkSession时直接指定依赖:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName('test-app') \ .config("spark.jars.packages", "org.apache.spark:spark-avro_2.13:3.5.0") # 这里替换成你实际的Scala版本 .getOrCreate() df = spark.read.format('avro').load('twitter.avro')
3. 清理本地依赖缓存
如果之前安装过不同版本的Avro包,缓存里的旧文件会干扰。删除以下目录(根据你的系统):
~/.ivy2/cache/org.apache.spark/spark-avro~/.m2/repository/org/apache/spark/spark-avro
然后重新启动PySpark加载包。
4. 用spark-submit运行脚本
如果交互式环境一直有问题,把代码写成脚本(比如read_avro.py),然后用spark-submit指定包运行:
spark-submit --packages org.apache.spark:spark-avro_2.13:3.5.0 read_avro.py
验证是否解决
运行成功后,可以检查Avro包是否正确加载:
for url in spark.sparkContext._jvm.java.lang.ClassLoader.getSystemClassLoader().getURLs(): if "spark-avro" in url.getPath(): print(url.getPath())
确保输出的jar包版本和你指定的一致,且Scala版本匹配。
备注:内容来源于stack exchange,提问作者Inthe interviewprep
相关产品推荐
相关产品推荐

