繁体   English   中英

Spark Geo瓷砖加入

[英]Spark geo tiles join

我的spark任务的性能有问题。

我有两个桌子:

  • 网格大小为200x200米的地理网。 大小约为200万行。 架构:

    cell_id minlat minlon maxlat maxlon

  • 地理对象。 大小约20万行。 架构:

    objid lat lon

我想要的是加入这些表并找到每个对象的单元格。 所需架构:

objid lat lon cell_id

第一个幼稚的解决方案是:

  cellDF.join(objDF, callUDF("isContain", col("minlat"),..col("lat"), col("lon")));

UDF只检查minlat <= lat <= maxlat && minlon <= lon <= maxlon

但是此解决方案的工作速度非常慢。 在具有20多个节点的群集上需要几个小时。

我尝试过的第二件事-使用esri-geometry-api 我为每个单元格创建了Polygon ,为每个对象创建了Point ,然后检查了polygon.contains(point) 但是此解决方案的工作速度比第一个慢。

也许对于此类加入有“最佳实践”? 我找到了有关QuadTree的一些信息,但是在spark中找不到该算法的任何清晰的文档和示例。

PS Spark版本为2.2.0。

假设您有两个csv文件(如果不正确,则只需更改输入)

// Create a spark session
SparkSession session = SparkSession.builder().appName("name here").getOrCreate();

// Create datasets for both input
Dataset<Fishnet> fishnet = session.read().format("csv").option("header", true).option("inferSchema", true).load("fishnet.csv").as(Encoders.bean(Fishnet.class));
Dataset<GeoObject> geoObject = session.read().format("csv").option("header", true).option("inferSchema", true).load("geoObject.csv").as(Encoders.bean(GeoObject.class));

// Create temp view on datasets
fishnet.createOrReplaceTempView("fishnet");
geoObject.createOrReplaceTempView("geoObject");

// Now create a query to retrieve the result [objid lat lon cell_id]
Dataset<Row> result = session.sql("select objid, lat, lon, cell_id from fishnet, geoObject where lat >= minlat and lat <= maxlat and lon >= minlon and lon <= maxlon");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM