我在地图上有一个感兴趣的点数据集,如下所示:
ID latitude longitude
1 48.860294 2.338629
2 48.858093 2.294694
3 48.8581965 2.2937403
4 48.8529717 2.3477134
...
目标是找到彼此非常接近的点群(距离小于100米)。 所以我期望这个数据集的输出是:
(2, 3)
第2点和第3点非常接近,距离小于100米,而其他距离很远,所以应该忽略它们。
由于数据集对于世界上所有感兴趣的点都是巨大的,我需要使用Spark进行一些并行处理。 我应该采取什么方法处理这个案子?
答案 0 :(得分:0)
我很乐意在这里进行交叉加入,但是由于你的数据很庞大,这可能不会起作用。
一种方法是按区域划分数据。这意味着您可以将输入数据更改为
ID latitude longitude latitiude_int longitude_int group_unique_id
1 48.860294 2.338629 48 2 48_2
2 48.858093 2.294694 48 2 48_2
3 48.8581965 2.2937403 48 2 48_2
4 48.8529717 2.3477134 48 2 48_2
这里的假设是,如果lat / long的积分部分改变将导致> 100米偏差。
现在您可以对数据进行分区w.r.t group_unique_id,然后对每个分区进行交叉连接。
这可能会减少工作量。
答案 1 :(得分:0)
我实际上使用以下两种方法解决了这个问题:
DBSCAN算法实现为具有分区的Spark作业
https://github.com/irvingc/dbscan-on-spark
具有空间距离连接的GeoSpark
https://github.com/DataSystemsLab/GeoSpark
它们都基于Spark,因此它们可以很好地处理大量数据。 但是我发现dbscan-on-spark消耗了大量内存,所以我最终使用了距离连接的GeoSpark。