在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
相关产品推荐
相关产品推荐

