Apache Sedona执行报错:scala/collection/IterableOnce类未找到
解决SedonaContext创建时的Scala类加载冲突问题
问题原因
报错java.lang.NoClassDefFoundError: scala/collection/IterableOnce的核心原因是:该类仅在Scala 2.13及以上版本中存在,而你指定的Sedona依赖是基于Scala 2.12编译的(sedona-spark-3.4_2.12:1.6.1),但运行环境中意外引入了Scala 2.13的依赖包,导致类加载矛盾。
解决方案
1. 强制锁定Scala 2.12版本依赖
修改SparkSession配置,手动指定Scala 2.12的标准库依赖,覆盖传递依赖带来的高版本Scala包:
spark = SparkSession.builder \ .appName("SedonaTest") \ .config("spark.jars.packages", "org.apache.sedona:sedona-spark-3.4_2.12:1.6.1,org.datasyslab:geotools-wrapper:1.6.1-28.2,org.scala-lang:scala-library:2.12.18") \ .getOrCreate() sedona = SedonaContext.create(spark)
注:2.12.18可替换为你本地Spark环境使用的Scala 2.12具体小版本。
2. 排除冲突的Scala依赖
如果是第三方依赖(如geotools-wrapper的传递依赖)拉取了Scala 2.13包,可通过spark.jars.excludes排除高版本Scala库:
spark = SparkSession.builder \ .appName("SedonaTest") \ .config("spark.jars.packages", "org.apache.sedona:sedona-spark-3.4_2.12:1.6.1,org.datasyslab:geotools-wrapper:1.6.1-28.2") \ .config("spark.jars.excludes", "org.scala-lang:scala-library") \ .getOrCreate()
此配置会强制使用Spark自带的Scala 2.12版本库。
3. 手动添加本地Jar包(避免动态依赖冲突)
- 下载对应版本的Jar包:
sedona-spark-3.4_2.12-1.6.1.jar、geotools-wrapper-1.6.1-28.2.jar - 将Jar包复制到Spark安装目录的
jars文件夹下 - 调整代码,移除
spark.jars.packages配置:
spark = SparkSession.builder \ .appName("SedonaTest") \ .getOrCreate() sedona = SedonaContext.create(spark)
4. 清理Spark依赖缓存
如果之前拉取过错误版本的依赖,清理本地缓存后重新拉取:
# 清理Ivy缓存(Spark默认依赖管理工具) rm -rf ~/.ivy2/cache/org.apache.sedona rm -rf ~/.ivy2/cache/org.datasyslab # 清理Maven缓存(若使用Maven作为依赖源) rm -rf ~/.m2/repository/org/apache/sedona rm -rf ~/.m2/repository/org/datasyslab
额外验证点
- 执行
spark-shell查看控制台输出的Scala版本,确保是2.12.x - 执行
pip show pyspark查看版本,需与SPARK_HOME对应版本匹配
内容的提问来源于stack exchange,提问作者systfail
相关产品推荐
相关产品推荐

