使用Hadoop工具集匹配地质点

使用Hadoop工具集匹配地质点,hadoop,geolocation,apache-spark,Hadoop,Geolocation,Apache Spark,我有两个数据集,比方说签入和POI,我必须根据地理坐标将它们连接起来:比方说,如果在POI附近N km的半径内看到用户,我需要将它们连接起来(换句话说,我想收集每个POI附近的所有用户,以便进一步操作)。但是我对这个地理匹配有一个问题 最初我看到两个不同的机会: 1) 实现LSH(位置敏感哈希)-看起来非常复杂,性能也可能受到影响 2) 在区域(2D矩阵)中分割所有地图,然后计算距离签入或POI N km范围内的区域数-然后发射所有区域-结果必须应用一些重复数据消除-因此,根本不确定该算法是否有

我有两个数据集,比方说签入和POI,我必须根据地理坐标将它们连接起来:比方说,如果在POI附近N km的半径内看到用户,我需要将它们连接起来(换句话说,我想收集每个POI附近的所有用户,以便进一步操作)。但是我对这个地理匹配有一个问题

最初我看到两个不同的机会: 1) 实现LSH(位置敏感哈希)-看起来非常复杂,性能也可能受到影响 2) 在区域(2D矩阵)中分割所有地图,然后计算距离签入或POI N km范围内的区域数-然后发射所有区域-结果必须应用一些重复数据消除-因此,根本不确定该算法是否有效

有什么最佳实践吗?

有趣的问题

我想您已经考虑过天真的暴力方法,并且发现它对于您的目的来说太耗时了。在蛮力方法中,计算每个
n
poi和每个
m
签入之间的距离,导致时间复杂度为
O(n*m)

我能想到的在Spark中也适用的最简单的启发式方法是通过将数据集元素分组到存储桶中来减少对一个数据集的完全线性扫描。大概是这样的:

case class Position(x: Double, y: Double)
val checkins: RDD[Position] = ???
val radius = 10
val checkinBuckets = checkins.groupBy(pos => (pos.x/radius).toInt)
与全线性扫描不同,只能搜索相应的、下一个和上一个存储桶。如有必要,可以通过对bucket进行分组来创建第二级,以进一步加快查找速度。此外,还应注意一些细节,如正确的
pos.x/radius
四舍五入等


当然,你可以像@huitseeker所建议的那样,深入研究最近邻搜索问题。还有一个很好的介绍。

所以你要问的是最近邻搜索。你看过这里吗?