Spark Geolocated Points聚类

时间:2018-03-26 17:35:28

标签: apache-spark computational-geometry

我在地图上有一个感兴趣的点数据集,如下所示: 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进行一些并行处理。 我应该采取什么方法处理这个案子?

2 个答案:

答案 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。