Apache Sedona 是一个可用于处理大规模空间数据的开源计算框架,支持集成 Apache Spark 等计算集群进行分布式计算,适用于地理位置数据分析、城市规划、交通分析等场景。本文介绍如何在阿里云EMR Serverless Spark中集成并使用Apache Sedona。
背景信息
Apache Sedona 是一个开源的分布式空间计算框架,阿里云EMR Serverless Spark可集成Apache Sedona实现大规模空间数据处理。
功能特性
分布式空间计算:基于Spark分布式计算框架,支持处理GB~PB级空间数据。
丰富的空间函数:支持200+空间函数,包括几何构造、空间关系判断、空间分析等,符合SQL/MM Part3空间SQL标准。
多数据格式支持:支持GeoJSON、Shapefile、GeoParquet、PostGIS等多种空间数据格式。
空间查询优化:提供空间索引、空间过滤下推、空间连接优化等机制。
多语言支持:提供SQL、Python、Scala、Java、R等多种语言API。
适用场景
自动驾驶:分析车辆轨迹数据、道路网络空间关系、障碍物检测、路径规划等。
地理位置分析:分析用户位置、POI热点、商圈范围等。
环境监测:分析空气质量分布、水质监测、污染源追踪等。
物流配送:优化配送路径、区域划分、配送范围分析等。
使用限制
版本要求:Sedona、Geotools等依赖需要和Spark主版本、Java版本、Scala版本匹配,对应关系如下:
Sedona版本
Spark版本
Java版本
1.8.x
Spark 3.4+
Java 11+
1.7.x
Spark 3.3+
Java 8+
1.6.x
Spark 3.2+
Java 8+
说明Sedona 1.8.x 不支持Java 8,引擎版本需选择esr-4.5.0及以上。
阿里云EMR Serverless Spark引擎版本与Spark版本、Java版本对应关系,请参见引擎版本介绍。
JDBC查询限制:开源JDBC无法直接返回GEOMETRY类型数据,需要使用
ST_AsText()或ST_AsGeoJSON()转换为文本格式返回。
使用方式
以下以在SQL会话中使用Sedona 1.8.1(引擎版本esr-4.7.0)为例进行说明。
下载测试资源文件。
以Sedona 1.8.1为例,需要下载以下文件(更多版本请参见Sedona官网):
新建SQL会话。
选择esr-4.7.0版本,添加如下Spark参数,点击创建并等待SQL会话启动:
spark.emr.serverless.user.defined.jars oss://<bucket>/<path>/sedona-spark-shaded-3.5_2.12-1.8.1.jar,oss://<bucket>/<path>/geotools-wrapper-1.8.1-33.1.jar spark.serializer org.apache.spark.serializer.KryoSerializer spark.kryo.registrator org.apache.sedona.viz.core.Serde.SedonaVizKryoRegistrator spark.sql.extensions org.apache.sedona.viz.sql.SedonaVizExtensions,org.apache.sedona.sql.SedonaSqlExtensions新建Spark SQL类型任务,执行以下SQL:
-- 创建点数据表 CREATE TABLE IF NOT EXISTS pointraw (_c0 string, _c1 string) USING csv OPTIONS(header='false') LOCATION 'oss://<bucket>/<path>/testpoint.csv'; -- 创建多边形数据表 CREATE TABLE IF NOT EXISTS polygonraw (_c0 string, _c1 string, _c2 string, _c3 string) USING csv OPTIONS(header='false') LOCATION 'oss://<bucket>/<path>/testenvelope.csv'; -- 创建点几何对象 CREATE OR REPLACE TEMP VIEW pointdata AS SELECT ST_Point(cast(pointraw._c0 as Decimal(24,20)), cast(pointraw._c1 as Decimal(24,20))) AS pointshape FROM pointraw; CREATE OR REPLACE TEMP VIEW polygondata AS SELECT ST_PolygonFromEnvelope( cast(polygonraw._c0 as Decimal(24,20)), cast(polygonraw._c1 as Decimal(24,20)), cast(polygonraw._c2 as Decimal(24,20)), cast(polygonraw._c3 as Decimal(24,20)) ) AS polygonshape FROM polygonraw; -- 空间包含查询 SELECT ST_AsText(polygondata.polygonshape) AS polygon_text, ST_AsText(pointdata.pointshape) AS point_text FROM polygondata, pointdata WHERE ST_Contains(polygondata.polygonshape, pointdata.pointshape) AND ST_Contains(ST_PolygonFromEnvelope(1.0,101.0,501.0,601.0), polygondata.polygonshape) LIMIT 5;说明SQL会话无法直接返回GEOMETRY类型数据,需要使用
ST_AsText()或ST_AsGeoJSON()等转换为文本格式。查看预期输出结果,输出为文本格式的Polygon和Point数据。
