美文网首页开源geospark
Sedona Sql 入门-千万级点面的相交分析

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

作者: polong | 来源:发表于2022-01-13 11:25 被阅读0次

        项目一直有空间大数据的需求,之前使用的是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不能用单引号,血泪经验)

    面数据 点数据

    处理流程

        初始化代码,要设置序列化,设置分区,设置使用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-8c5e97-1642044059262)]

    参考资料:

    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

    相关文章

      网友评论

        本文标题:Sedona Sql 入门-千万级点面的相交分析

        本文链接:https://www.haomeiwen.com/subject/acjncrtx.html