Spark 地理定位点聚类

Spark Geolocated Points Clustering

我有一个地图上的兴趣点数据集,如下所示: 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距离很近,不到100m,其他点比较远,可以忽略。

由于数据集很大,包含世界上所有的兴趣点,我需要使用 Spark 进行一些并行处理。 对于这种情况我应该采取什么方法?

我很想在这里做一个交叉连接,但是这可能行不通,因为你的数据很大。

一种方法是按区域明智地划分数据。这意味着您可以将输入数据更改为

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的积分部分发生变化,将导致> 100m的偏差。

现在您可以对数据进行分区 w.r.t group_unique_id,然后对每个分区进行交叉连接。

这可能会减少工作量。

我实际上使用以下两种方法解决了这个问题:

DBSCAN 算法实现为带分区的 Spark 作业
https://github.com/irvingc/dbscan-on-spark

具有空间距离连接的 GeoSpark
https://github.com/DataSystemsLab/GeoSpark

它们都基于 Spark,因此它们可以很好地处理大规模数据。 但是我发现 dbscan-on-spark 消耗大量内存,所以我最终使用了带有距离连接的 GeoSpark。