集成Apache Sedona进行空间数据分析

更新时间:
复制为 MD 格式

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)为例进行说明。

  1. 下载测试资源文件。

    Sedona 1.8.1为例,需要下载以下文件(更多版本请参见Sedona官网):

  2. 新建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
  3. 新建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()等转换为文本格式。

  4. 查看预期输出结果,输出为文本格式的PolygonPoint数据。image