Spark无com.databricks.spark.avro依赖读取Avro文件遇阻求助
解决Spark读取Avro文件的依赖问题
我来帮你一步步搞定这个Spark读取Avro的问题——你遇到的这几个坑我之前在项目里也踩过,咱们逐个拆解:
核心问题根源
你遇到的所有报错,本质都是依赖包的版本和你的Spark/Scala版本不匹配,或者用了过时的依赖包导致的。先明确几个关键点:
- 旧版的
com.databricks.spark.avro包现在已经和Spark官方的Avro模块整合,但版本必须严格对应Spark和Scala的版本; - Spark 2.4及以上版本其实内置了官方Avro支持(格式名直接用
avro),但同样需要确保依赖包存在。
步骤1:确认你的Spark和Scala版本
先运行这条命令查看集群的Spark和Scala版本:
spark-shell --version
输出里会显示类似这样的信息:
Spark version 3.2.0
Scala version 2.12.15 (OpenJDK 64-Bit Server VM, Java 1.8.0_342)
记下来这两个版本号,后续所有操作都要基于它们。
步骤2:正确引入Avro依赖
方案A:用官方推荐的--package方式(最省心)
根据你拿到的版本号,构造正确的包名:
格式:com.databricks:spark-avro_{Scala版本}:{Spark版本}
比如Spark 3.2.0 + Scala 2.12的话,启动命令是:
spark-shell --package com.databricks:spark-avro_2.12:3.2.0
为什么之前你的命令失败?因为你用的
com.databricks:spark-avro_2.10:0.1是极其老旧的版本,不仅Scala版本和集群不匹配,Maven仓库里甚至可能已经找不到这个包了。
方案B:手动下载jar包并引入
如果你因为网络问题无法用--package拉取依赖,可以:
- 下载和你版本完全匹配的
spark-avrojar包; - 用以下命令启动spark-shell:
spark-shell --jar /path/to/your/spark-avro_2.12-3.2.0.jar
注意:你之前用
spark-avro_2.11-3.2.0.jar启动失败,是因为Spark 3.2.0对应的Scala版本是2.12,jar包的Scala版本和Spark不兼容,导致启动报错。
步骤3:正确读取Avro文件
依赖引入成功后,读取Avro有两种方式:
方式1:用databricks的格式名(兼容旧代码)
val avroDF = spark.read.format("com.databricks.spark.avro").load("dirpath/*.avro") avroDF.show()
方式2:用Spark官方的格式名(Spark 2.4+推荐)
val avroDF = spark.read.format("avro").load("dirpath/*.avro") avroDF.show()
集群模式作业的额外注意
如果是用spark-submit提交作业,同样需要带上依赖参数:
spark-submit --package com.databricks:spark-avro_2.12:3.2.0 --class com.yourcompany.YourMainClass your-application.jar
内容的提问来源于stack exchange,提问作者Aavik
相关产品推荐
相关产品推荐

