使用hadoop工具集匹配地理点

j13ufse2  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(307)

我有两个数据集,比如checkins和poi,我必须基于地理坐标来连接它们:比如说,如果在poi附近n公里的半径内看到用户,我需要连接它们(换句话说,我希望收集每个poi附近的所有用户,以便进一步操作)。但我对地理匹配有意见。。。
最初我看到了两个不同的机会:1)实现lsh(位置敏感哈希)-看起来非常复杂,性能也可能会受到影响2)将所有Map拆分为区域(2d矩阵),然后计算距离签入或poi n公里内的区域数-然后发射所有区域-结果必须应用一些重复数据消除-所以,根本不确定它是否有效
有什么最佳实践吗?

tsm1rwdh

tsm1rwdh1#

有趣的问题。
我想你已经考虑过天真的暴力方法,并且发现它对于你的目的来说太耗时了。在蛮力法中,你计算每一个物体之间的距离 n POI和 m 签入,导致 O(n*m) .
我能想到的最简单的启发式方法也适用于spark,就是通过将数据集元素分组到bucket中来减少对一个数据集的完全线性扫描。像这样:

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 gps距离计算等。
当然,对于@huitseeker提出的最近邻搜索问题,您可以深入研究各种方法。另外,本文还有一个很好的介绍。

相关问题