匹配地理输出与Hadoop工具集

时间:2015-01-16 17:43:35

标签: hadoop geolocation apache-spark

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

最初我看到两个不同的机会: 1)实现LSH(局部敏感散列) - 看起来非常复杂,性能也可能受到影响 2)拆分区域中的所有地图(2D矩阵),然后计算在距离签入或POI的N km范围内有多少个区域 - 然后发出所有这些 - 结果必须应用一些重复数据删除 - 因此,不确定它是否有效algo at all

任何最佳做法?

1 个答案:

答案 0 :(得分:0)

有趣的问题。

我认为你已经考虑过天真的蛮力方法,并且发现它太耗费时间用于你的目的。在蛮力方法中,您可以计算每个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)

不是完全线性扫描,而是只搜索相应的,下一个和前一个桶。如有必要,可以通过对存储桶进行分组来创建第二级,以进一步加快查找速度。此外,还应该注意正确舍入pos.x/radiusgps distance calculation等详细信息。

当然,您可以随时潜入various approaches以获取@huitseeker提出的最近邻搜索问题。此外,this paper有一个很好的介绍NNS。