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。
我有一个地图上的兴趣点数据集,如下所示:
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。