Apache Sedona 1.9.1 常用工具与 API 详解
Apache Sedona 1.9.1 常用工具与 API 详解:spark-shell/pyspark/spark-submit 三种入口实测用法,构造、量测、空间关系、坐标变换等 ST_ 函数速查(全 256 个),Python GeometryType UDT 与 shapely 互通示例,含 FAQ,全程实测。
Apache Sedona 1.9.1 常用工具与 API 详解
目标:详解 Apache Sedona 1.9.1 的使用入口与核心 API。Sedona 无独立命令行程序,一切操作通过 Spark 的
spark-shell/pyspark/spark-submit三个入口加载 Sedona jar 后以 SQL 函数(ST_*)或 Python API 完成。本文按入口与函数分类速查,给出代码示例与真实回显(含 256 个 ST_ 函数规模实测、GeometryType UDT 与 shapely 互通实测)。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- Java:OpenJDK 17.0.20.1
- Spark:3.5.9(
/opt/spark,local 模式) - Sedona 版本:1.9.1(
/opt/sedona-jars/sedona-spark-shaded-3.5_2.12-1.9.1.jar) - GeoTools wrapper:
/opt/sedona-jars/geotools-wrapper-1.9.1-33.5.jar - Python:3.10.12(pyspark 3.5.9、apache-sedona 1.9.1、shapely 2.1.2)
- 演示账号:root
二、工具概览
Sedona 以「Spark 插件 jar」形态提供,没有 sedona 命令行可执行程序。全部操作 = Spark 入口 + Sedona jar + SedonaContext.create 注册,之后 SQL 与 Python API 通用:
| 入口 | 语言 | 典型用途 |
|---|---|---|
| spark-shell | Scala/SQL | 交互式查询、脚本验证(-i 加载脚本) |
| pyspark / python3 | Python | 数据分析脚本、Notebook |
| spark-submit | 任意 | 生产作业提交 |
| API 类别 | 代表函数/类 | 作用 |
|---|---|---|
| 几何构造 | ST_Point、ST_GeomFromText、ST_GeomFromWKT | 从坐标或 WKT 构造几何类型 |
| 几何输出 | ST_AsText、ST_AsGeoJSON | 几何转 WKT/GeoJSON 文本 |
| 空间量测 | ST_Area、ST_Distance、ST_Length | 面积、距离、长度 |
| 空间关系 | ST_Contains、ST_Intersects、ST_Within | 范围连接/相交判断 |
| 坐标变换 | ST_Transform | CRS 投影转换(依赖 geotools-wrapper) |
| Python 类型 | GeometryType(UDT) | shapely 几何与 Spark 列互转 |
💡 说明:Sedona 1.9.1 注册后共有 800 个函数,其中
ST_前缀的空间函数 256 个(实测统计,见 5.6 节)。
三、前置条件
已按《Ubuntu 22.04 安装 Apache Sedona 1.9.1 指南》完成安装与验证:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PYSPARK_PYTHON=python3
python3 /opt/sedona_verify.py
实测回显:
+-----------+
|point |
+-----------+
|POINT (1 2)|
+-----------+
四、三个入口工具详解
4.1 spark-shell(Scala 交互式)
方案 A 的 spark-defaults.conf 已全局引入 Sedona jar,直接启动:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
/opt/spark/bin/spark-shell --master "local[*]"
实测启动横幅关键行:
Spark context available as 'sc' (master = local[*], app id = local-1791810790684).
Spark session available as 'spark'.
在提示符中注册 Sedona 并查询:
import org.apache.sedona.spark.SedonaContext
val sedona = SedonaContext.create(spark)
sedona.sql("SELECT ST_AsText(ST_Point(1.0, 2.0)) AS point").show(false)
实测回显:
+-----------+
|point |
+-----------+
|POINT (1 2)|
+-----------+
也可用 -i 一次性加载脚本(脚本注释须为 ASCII,见《Ubuntu 22.04 安装 Apache Sedona 1.9.1 指南》FAQ Q2):
/opt/spark/bin/spark-shell --master "local[*]" -i /opt/sedona-demo/sedona_demo.scala
4.2 pyspark 与 python3(Python)
两种 Python 用法:交互式 REPL 用 pyspark 命令;分析脚本用 python3 直接运行(代码内 SparkSession.builder 创建会话),后者更适合沉淀成作业:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PYSPARK_PYTHON=python3
cd /opt/sedona-demo
python3 sedona_demo.py
会话创建与注册的标准写法(见《Apache Sedona 1.9.1 构建并运行示例空间分析应用指南》第四节完整源码):
from sedona.spark import SedonaContext
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("SedonaPythonDemo") \
.config("spark.jars", "/opt/sedona-jars/sedona-spark-shaded-3.5_2.12-1.9.1.jar,/opt/sedona-jars/geotools-wrapper-1.9.1-33.5.jar") \
.config("spark.driver.memory", "512m") \
.getOrCreate()
sedona = SedonaContext.create(spark)
4.3 spark-submit(作业提交)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PYSPARK_PYTHON=python3
cd /opt/sedona-demo
/opt/spark/bin/spark-submit --master "local[*]" --conf spark.log.level=WARN sedona_demo.py
查询结果与 python3 直跑一致;作业正常退出时日志尾部实测:
26/10/12 13:25:26 INFO SparkContext: Successfully stopped SparkContext
26/10/12 13:25:27 INFO ShutdownHookManager: Shutdown hook called
💡 说明:spark-submit 默认日志级别为 INFO(spark-shell 默认 WARN);
--conf spark.log.level=WARN可静默运行日志。JVM 堆生效值验证用jps -v | grep -oE "\-Xmx[0-9]+m",实测输出-Xmx512m。
五、SQL 函数(ST_*)速查
5.1 几何构造
SELECT ST_AsText(ST_Point(1.0, 2.0)) AS point;
SELECT ST_AsText(ST_GeomFromText('POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))')) AS poly;
实测回显:
+-----------+
|point |
+-----------+
|POINT (1 2)|
+-----------+
| 函数 | 说明 |
|---|---|
| ST_Point(x, y) | 由坐标构造点 |
| ST_GeomFromText(wkt) / ST_GeomFromWKT(wkt) | WKT 字符串转几何(两者等价) |
| ST_GeomFromGeoJSON(json) | GeoJSON 转几何 |
| ST_Polygon(linestring, polygon) | 由外壳与内洞构造多边形 |
5.2 几何输出
| 函数 | 实测示例 | 输出 |
|---|---|---|
| ST_AsText(geom) | ST_AsText(ST_Point(1.0, 2.0)) | POINT (1 2) |
| ST_AsGeoJSON(geom) | 输出 GeoJSON 文本 | — |
5.3 空间量测
SELECT round(ST_Area(ST_GeomFromText('POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))')), 1) AS area;
实测回显:
+----+
|area|
+----+
|16.0|
+----+
| 函数 | 说明 |
|---|---|
| ST_Area(geom) | 面积(上例 4×4 矩形 = 16.0) |
| ST_Distance(g1, g2) | 两几何最短欧氏距离(KNN 依据,见 5.5 节实测) |
| ST_Length(geom) | 线长度 |
5.4 空间关系(连接谓词)
| 函数 | 语义 |
|---|---|
| ST_Contains(a, b) | a 包含 b(b 在边界上时为假) |
| ST_Intersects(a, b) | a 与 b 至少有一点相交(含边界) |
| ST_Within(a, b) | a 包含于 b(Contains 的反视角) |
| ST_DWithin(a, b, d) | 两几何距离是否小于等于 d(常用于范围过滤) |
实测:ST_Contains 范围连接命中 3 行、ST_Intersects 计数 3(完整回显见《Apache Sedona 1.9.1 构建并运行示例空间分析应用指南》第六节)。
5.5 坐标变换与衍生几何
SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT (116.397128 39.916527)'), 'EPSG:4326', 'EPSG:3857')) AS pt3857;
SELECT ST_AsText(ST_PointOnSurface(ST_GeomFromText('POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))'))) AS center;
实测回显:
+--------------------------------------------+
|pt3857 |
+--------------------------------------------+
|POINT (12957269.018759485 4853819.614609157)|
+--------------------------------------------+
+-----------+
|center |
+-----------+
|POINT (2 2)|
+-----------+
| 函数 | 说明 |
|---|---|
| ST_Transform(geom, srcCRS, dstCRS) | CRS 投影转换(依赖 geotools-wrapper jar) |
| ST_PointOnSurface(geom) | 面内代表点(上例 4×4 矩形中心 (2,2)) |
| ST_Centroid(geom) | 几何质心 |
| ST_Buffer(geom, d) | 缓冲区 |
5.6 函数规模统计(实测)
python3 会话中统计全部注册函数:
all_fns = [r[0] for r in sedona.sql("SHOW FUNCTIONS").collect()]
st_fns = sorted(f for f in all_fns if f.lower().startswith("st_"))
print("ALL_FUNCTION_COUNT =", len(all_fns))
print("ST_FUNCTION_COUNT =", len(st_fns))
实测回显:
ALL_FUNCTION_COUNT = 800
ST_FUNCTION_COUNT = 256
函数名样例(实测首尾各一批):
st_3ddistance, st_3ddwithin, st_3dextent, st_3dmakebox, st_addmeasure, st_addpoint, st_affine, st_angle, st_approximatemedialaxis, st_area, st_areaspheroid, st_asbinary, st_asewkb, st_asewkt, st_asgeojson, st_asgml
st_xmin, st_y, st_ymax, st_ymin, st_z, st_zmax, st_zmflag, st_zmin
⚠️ 注意:
SHOW FUNCTIONS LIKE 'ST_%'在 Spark 3.5.9 实测返回 0 行(LIKE 模式对存储名大小写敏感,Sedona 注册名为混合大小写);统计请SHOW FUNCTIONS全量后客户端过滤。
六、Python API:GeometryType UDT 与 shapely 互通
Python 路线可直接用 shapely 几何对象建 DataFrame,Sedona 通过 GeometryType UDT 自动承载:
import shapely.geometry as sg
from sedona.spark.sql.types import GeometryType
df = sedona.createDataFrame([(1, sg.Point(1.0, 2.0)), (2, sg.Point(3.0, 4.0))], schema=["id", "geom"])
df.select("id", "geom").show(truncate=False)
print("SCHEMA:", df.schema.simpleString())
print("UDT_CLASS:", type(df.schema["geom"].dataType).__name__)
实测回显:
+---+-----------+
|id |geom |
+---+-----------+
|1 |POINT (1 2)|
|2 |POINT (3 4)|
+---+-----------+
SCHEMA: struct<id:bigint,geom:udt>
UDT_CLASS: GeometryType
要点:
| API | 说明 |
|---|---|
| SedonaContext.create(spark) | 注册 ST_ 函数、几何 UDT 与优化器规则(1.4+ 统一入口) |
| GeometryType(sedona.spark.sql.types) | 几何列的 UDT 类型,承载 shapely 对象 |
| sedona.sql(sqlText) | 等价 spark.sql,返回 DataFrame |
| createDataFrame(data, schema) | 本地数据(含 shapely 几何)转分布式 DataFrame |
七、注意事项
⚠️ 注意:
- 三个入口的 Sedona jar 必须配套:
spark-shell/spark-submit走spark-defaults.conf或--jars,Python 路线在SparkSession.builder的spark.jars注入,路径为绝对路径。- Python 路线需
pandas/pyarrow依赖(缺失时import sedona.spark直接失败)。ST_Transform需 geotools-wrapper jar;缺失时构造/量测函数可用,仅 CRS 变换报错。- SQL 函数名大小写不敏感(
st_contains与ST_Contains均可执行),但SHOW FUNCTIONS LIKE模式匹配大小写敏感。
八、常见问题
Q1:from sedona.spark import SedonaContext 报 ModuleNotFoundError?
apache-sedona 未安装或 pandas 缺失。pip3 install pyspark==3.5.9 apache-sedona==1.9.1 pandas pyarrow(实测版本组合见《Ubuntu 22.04 安装 Apache Sedona 1.9.1 指南》方案 B)。
Q2:spark-shell 里 SedonaContext.create 找不到符号?
未加载 Sedona jar 或 import 错误。确认 spark.jars 已配置且执行了 import org.apache.sedona.spark.SedonaContext。
Q3:SQL 函数执行报 UNRESOLVED_ROUTINE?
该函数不存在或 jar 未注册。先用 SHOW FUNCTIONS 全量确认函数名(注意 LIKE 大小写陷阱),再核对 SedonaContext.create 是否已执行。
Q4:shapely 对象进 DataFrame 报类型不支持?
未执行 SedonaContext.create(UDT 未注册)。注册后 shapely 的 Point/Polygon 等 Geometry 子类即可经 GeometryType 承载(实测 schema 显示 geom:udt)。
九、参考链接
- Sedona SQL 函数总览:
https://sedona.apache.org/latest-snapshot/api/sql/Overview/ - Sedona Python API:
https://sedona.apache.org/latest-snapshot/api/sql/DataFrameAPI/ - Spark 快速上手:
https://spark.apache.org/docs/latest/quick-start.html - Sedona 官网:
https://sedona.apache.org/