使用GeoSpark(Apache Sedona)读CSV多边形数据报NoClassDefFoundError错误
错误原因分析
该报错核心为GeoSpark版本与本地Spark/Scala版本不兼容:
你当前引入的geospark-sql_2.3:1.3.1是针对Spark 2.3、Scala 2.11编译的版本,如果你的本地环境满足以下任一情况都会触发类找不到错误:
- 本地Spark版本为2.4+:Spark 2.4开始调整了
CodegenFallback类的实现路径,移除了原有的$class后缀实现类 - 本地Spark使用的Scala版本为2.12+:Scala 2.12调整了trait的编译规则,旧版本编译的GeoSpark无法加载对应接口实现
解决方案
方案1:升级为Apache Sedona适配高版本Spark(推荐)
GeoSpark已经捐献给Apache软件基金会,更名为Apache Sedona,原生支持Spark 2.4到3.x全版本,适配性更好。修改依赖和注册逻辑即可:
from pyspark.sql import SparkSession from sedona.register import SedonaRegistrator # Spark 3.0+ 对应依赖示例 spark = SparkSession.builder.master("local") \ .config("spark.jars.packages","org.apache.sedona:sedona-python-adapter-3.0_2.12:1.4.1") \ .getOrCreate() SedonaRegistrator.registerAll(spark) # 后续读取CSV、调用st_geomFromWKT的逻辑无需修改 df = spark.read.csv(path="D:\\Arshad\\data\\test.csv", header=True) df.createOrReplaceTempView("geotbl") df2 = spark.sql("select country, st_geomFromWKT(polygon) as geometry from geotbl")
方案2:匹配当前GeoSpark版本的依赖
如果要保留现有GeoSpark 1.3.1的代码,做以下任一调整即可:
- 若本地Spark版本为2.4.x,将依赖中的
geospark-sql_2.3:1.3.1修改为geospark-sql_2.4:1.3.1 - 若不想修改依赖,将本地PySpark版本回退到2.3.x:
pip install pyspark==2.3.4
内容的提问来源于stack exchange,提问作者Mohd Tajuddin Arshad
相关产品推荐
相关产品推荐

