Sedona Sql 入门千万级点面的相交分析

    项目一直有空间大数据的需求,之前使用的是spatial-framework-for-hadoop项目来处理,由于缺少空间索引,因此处理速度一直不太理想,所以一直在找合适的框架来处理空间数据。

    Apache Sedona™(incubating)就是一个专门处理大规模空间数据的spark框架,原为GeoSpark,后被Apache收录孵化,更名为Sedona,相比于传统的ArcGIS、QGIS等分析工具,Sedona可以提供更好分布式空间分析。

    GraalVM 是 Oracle 发布的下世代 Java 虚拟机,分别有社区版和企业版。Facebook团队使用了GraalVM作为OpenJDK的替代品。在这个场景中,迁移到GraalVM非常简单——只需要切换运行环境,不需要更改应用程序代码。这种转换使得应用程序运行得更快,这得益于GraalVM的高级性能优化,无需任何手动调优。

    本文就使用GraalVM和Apache Sedona对一千多万的面和一千多万的点进行相交分析。
框架采用的Spark(3.1.2),Hadoop(3.2),Sedona(1.1.1-incubating)

数据准备

    数据还是取自微软开源建筑物数据,处理出id和wkt的csv,(wkt不能用单引号,血泪经验)

image.png

image.png

处理流程

    初始化代码,要设置序列化,设置分区,设置使用rtree为空间索引

SparkSession spark = SparkSession.builder().
                     config("spark.serializer","org.apache.spark.serializer.KryoSerializer").
                     config("sedona.join.numpartition",900).config("sedona.globel.indextype","rtree").
                     config("spark.kryo.registrator","org.apache.sedona.core.serde.SedonaKryoRegistrator").
                     master("local[*]").appName("cn.dev.Learn04").getOrCreate();
SedonaSQLRegistrator.registerAll(spark);

    加载点面数据,生成点面数据集

String inputCSVPath = Learn042.class.getResource("/capnt.csv").toString();
Dataset pointDF = spark.read().format("csv").
        option("delimiter", ",").
        option("header", "true").
        load(inputCSVPath);
pointDF.createOrReplaceTempView("pointdf");

String inputBuildingCSVPath = Learn042.class.getResource("/california20191107.csv").toString();
Dataset buildingDF = spark.read().format("csv").
        option("delimiter", ",").
        option("header", "true").
        load(inputBuildingCSVPath);
buildingDF.createOrReplaceTempView("buildingdf");

    点面相交分析

sqlText = "select a.id,b.id from point as a,building as b where ST_contains(b.shape, a.shape)";
spatialDf = spark.sql(sqlText);
spatialDf.createOrReplaceTempView("re");

结果优化

    全部结果需要五分钟左右,借助Graalvm虚拟机和给数据集加缓存,可以优化到四分钟。
Sedona还是一个效率极高的空间大数据框架,值得多多研究。

spatialDf.cache();
spatialDf.count();

image.png

参考资料:

https://github.com/apache/incubator-sedona/

https://zhuanlan.zhihu.com/p/106555993

https://blog.csdn.net/huangmingleiluo/article/details/119321222

https://www.jianshu.com/p/e1d262ac3df8

原文地址:https://www.cnblogs.com/polong/p/15796941.html