Как пространственное разделение пространственногоRDD с GeoSpark? - PullRequest
0 голосов
/ 27 апреля 2018

Есть ли способ эффективно разделить пространственное СДР в GeoSpark? например: разделы со многими точками, расположенными близко друг к другу, чтобы быть в 1 разделе, используя GeoSpark или что-то похожее?

Ответы [ 2 ]

0 голосов
/ 29 июля 2019

В качестве дополнения к комментарию Георга, я хотел бы показать вам пример использования QuadTree. Остальные методы разбиения не использовались, но я ожидаю, что они будут вести себя одинаково (за исключением реального разбиения, конечно). При условии, что переменная, которую вы хотите разделить, - pointsRDD (которая на самом деле является объектом типа PointRDD в моем случае), вы можете сделать это следующим образом:

import com.vividsolutions.jts.index.quadtree.Quadtree
import com.vividsolutions.jts.index.SpatialIndex

val buildOnSpatialPartitionedRDD = true // Set to TRUE only if run join query
val numPartitions = 48
pointsRDD.analyze()
pointsRDD.spatialPartitioning(GridType.QUADTREE, numPartitions)
pointsRDD.buildIndex(IndexType.QUADTREE, buildOnSpatialPartitionedRDD)

Разделенные данные вы найдете в pointsRDD.spatialPartitionedRDD.rdd:

pointsRDD
  .spatialPartitionedRDD
  .rdd
  .mapPartitions(yourFunctionYouWantToRunOnEachPartition)

Вы можете проверить разделы, обратившись к дереву разделов:

pointsRDD.partitionTree.getAllZones.asScala.foreach(println)

, который даст что-то вроде

x: 15.857028 y: 53.36364 w: 9.872338000000003 h: 2.7383549999999985 PartitionId: null Lineage: null
x: 15.857028 y: 54.732817499999996 w: 4.936169000000001 h: 1.3691774999999993 PartitionId: null Lineage: null
x: 15.857028 y: 55.41740625 w: 2.4680845000000007 h: 0.6845887499999996 PartitionId: null Lineage: null
x: 15.857028 y: 55.759700625 w: 1.2340422500000003 h: 0.3422943749999998 PartitionId: null Lineage: null
x: 15.857028 y: 55.9308478125 w: 0.6170211250000002 h: 0.1711471874999999 PartitionId: 0 Lineage: null
...

Это можно визуализировать с помощью вашего любимого инструмента для построения графиков (извините, код не может содержать для этого):

QuadNodes

Чтобы проверить статистику разделов, используйте следующий код:

import org.apache.spark.sql.functions._
pointsRDD
  .spatialPartitionedRDD
  .rdd
  .mapPartitionsWithIndex{case (i,rows) => Iterator((i,rows.size))}
  .toDF("partition_number","number_of_records")
  .show()

что даст вам:

+----------------+-----------------+
|partition_number|number_of_records|
+----------------+-----------------+
|               0|             8240|
|               1|             7472|
|               2|             5837|
|               3|             3753|
+----------------+-----------------+
only showing top 4 rows
0 голосов
/ 03 июня 2018

См. http://datasystemslab.github.io/GeoSpark/tutorial/rdd/#use-spatial-partitioning

  • KDB-Tree
  • Quad-Tree
  • R-Tree

реализовано

...