You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Sedona上下文运行ST_GeomFromWKT函数报错,需补充哪些配置?

问题:Sedona ST_系列函数未定义异常解决方法

问题描述

我尝试执行以下Java代码,使用Sedona从CSV文件创建空间DataFrame:

SparkSession sparkSession = SedonaContext.builder()
            .master("local[*]") // 集群模式下删除此行
            .appName("readTestScala") // 替换为合适的应用名称
            .getOrCreate();

String csvFilePath = "test.csv";

Dataset<Row> rawDf = sparkSession.read()
    .format("csv")
    .option("header", "true")
    .option("inferSchema", "true")
    .load(csvFilePath);

// 将DataFrame注册为临时视图
rawDf.createOrReplaceTempView("data");

// 执行SQL查询将WKT转换为几何列
Dataset<Row> spatialDF = sparkSession.sql("SELECT *, ST_GeomFromWKT(geometry) AS geom FROM data");

运行时抛出异常:

Caused by: org.apache.spark.sql.AnalysisException: Undefined function:
'ST_GeomFromWKT'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.

已添加以下Maven依赖:

<dependency>
  <groupId>org.apache.sedona</groupId>
  <artifactId>sedona-spark-shaded-3.0_2.12</artifactId>
  <version>1.4.0</version>
</dependency>
<dependency>
  <groupId>org.apache.sedona</groupId>
  <artifactId>sedona-viz-3.0_2.12</artifactId>
  <version>1.4.0</version>
</dependency>
<!-- 可选依赖 -->
<dependency>
    <groupId>org.datasyslab</groupId>
    <artifactId>geotools-wrapper</artifactId>
    <version>1.4.0-28.2</version>
</dependency>

当前环境为Spark 3.4、Scala 2.12,请问还需哪些配置才能执行ST_系列函数?


解决步骤

1. 匹配Sedona与Spark版本

你当前使用的sedona-spark-shaded-3.0_2.12是针对Spark 3.0的版本,但环境是Spark 3.4,版本不匹配会导致函数无法正常注册。需更换为对应Spark 3.4的Sedona依赖:

<dependency>
  <groupId>org.apache.sedona</groupId>
  <artifactId>sedona-spark-shaded-3.4_2.12</artifactId>
  <version>1.5.1</version> <!-- 选择与Spark3.4兼容的稳定版本 -->
</dependency>
<dependency>
  <groupId>org.apache.sedona</groupId>
  <artifactId>sedona-viz-3.4_2.12</artifactId>
  <version>1.5.1</version>
</dependency>
<dependency>
    <groupId>org.datasyslab</groupId>
    <artifactId>geotools-wrapper</artifactId>
    <version>1.5.1-28.2</version> <!-- 与Sedona版本保持一致 -->
</dependency>

2. 显式注册Sedona SQL函数

创建SparkSession后,必须显式注册Sedona的空间SQL函数,否则Spark无法识别ST_*系列函数。添加以下代码:

import org.apache.sedona.sql.utils.SedonaSQLRegistrator;

// 创建SparkSession后立即执行注册
SedonaSQLRegistrator.registerAll(sparkSession);

3. (可选)配置Sedona推荐的序列化方式

添加Kryo序列化配置可提升空间数据处理性能,这也是Sedona官方推荐的配置:

SparkSession sparkSession = SedonaContext.builder()
            .master("local[*]")
            .appName("readTestScala")
            .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
            .config("spark.kryo.registrator", "org.apache.sedona.core.serde.SedonaKryoRegistrator")
            .getOrCreate();

// 注册SQL函数
SedonaSQLRegistrator.registerAll(sparkSession);

内容的提问来源于stack exchange,提问作者user1298426

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:45:27