PySpark+Sedona中ST_LengthSpheroid函数无法解析问题咨询
问题:Sedona中ST_LengthSpheroid函数无法解析
问题描述
我正在使用PySpark结合Apache Sedona处理地理相关任务,初始化代码如下:
spark = SparkSession.builder.appName("pyspark-geopandas").\ getOrCreate() config = SedonaContext.builder() .\ config('spark.jars.packages', 'org.apache.sedona:sedona-spark-3.4_2.12:1.5.1,' 'org.datasyslab:geotools-wrapper:1.5.1-28.2'). \ getOrCreate() sedona = SedonaContext.create(config) sc = sedona.sparkContext
执行以下SQL查询时触发错误:
final_df.createOrReplaceTempView("final_df") query = """select *, ST_LineStringFromText(final_df.geometry, ',') as geom, ST_LengthSpheroid(ST_LineStringFromText(final_df.geometry, ',')) as len from final_df""" final_df = sedona.sql(query)
错误信息:
pyspark.errors.exceptions.captured.AnalysisException: [UNRESOLVED_ROUTINE] Cannot resolve function `ST_LengthSpheroid` on search path
替换为ST_Length函数则可正常运行。
原因分析
- 函数注册差异:
ST_LengthSpheroid属于GeoTools扩展函数,并非Sedona 1.5.1版本默认注册到Spark SQL的核心函数,因此SQL上下文无法识别该函数。 - 版本限制:当前使用的Sedona 1.5.1未将该扩展函数自动加载到函数搜索路径,而
ST_Length是Sedona核心内置函数,默认完成注册。 - 依赖逻辑:
ST_LengthSpheroid依赖完整的GeoTools扩展注册逻辑,当前配置未触发该逻辑,导致函数无法被解析。
解决方法
1. 升级Sedona版本
新版本Sedona(如1.6.0+)已将更多GeoTools扩展函数纳入默认注册范围,更新依赖包即可:
config = SedonaContext.builder() .\ config('spark.jars.packages', 'org.apache.sedona:sedona-spark-3.4_2.12:1.6.0,' 'org.datasyslab:geotools-wrapper:1.6.0-28.2'). \ getOrCreate()
2. 手动注册所有Sedona SQL函数
在初始化Sedona上下文后,手动触发全量函数注册:
# 注册所有Sedona及扩展函数到SQL上下文 sc._jvm.org.apache.sedona.sql.utils.SedonaSQLRegistrator.registerAll(sc._jsc)
执行后重新运行你的SQL查询即可。
3. 用ST_Length替代实现相同效果
ST_Length支持通过参数启用球面椭球体计算,效果与ST_LengthSpheroid一致,修改SQL如下:
select *, ST_LineStringFromText(final_df.geometry, ',') as geom, ST_Length(ST_LineStringFromText(final_df.geometry, ','), true) as len from final_df
第二个参数true表示基于WGS84椭球体计算球面长度,与ST_LengthSpheroid默认行为匹配。
内容的提问来源于stack exchange,提问作者user2894156
相关产品推荐
相关产品推荐

