zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java基础之抽象类和多态
    Java基础之继承重载重写与this和super
    Java基础之StringBuffer的使用
    Java基础之String的方法与常量池
    Spring Boot之JSP开发
    Spring Boot之thymeleaf中替换th:each使用
    本周进度
    问卷调查立题报告(三人行)
    本周进度(复习软考)
    软件需求十步走之阅读笔记02
  • 原文地址:https://www.cnblogs.com/polong/p/15796941.html
Copyright © 2011-2022 走看看