使用Map Reduce查找特定记录附近的所有记录

时间:2013-04-09 00:51:43

标签: java hadoop mapreduce

我正在尝试实现map reduce程序来查找彼此接近的2GB数据集中的所有记录(类似于每条记录及其邻居应该是输出)。靠近,我指的是欧几里德距离。在数据集中,每个记录都有一个x和y坐标。任何人都可以建议我这样做的直觉。我知道地图应该发出每个记录,并且reduce可以简单地运行一个double for循环输入到它的列表中的每个条目以找到邻居,但是有更好的解决方案,因为我的实现速度非常慢。提前谢谢。

map(rid,r):
 emit(key,r)

reduce(key,lst=[r1,r2....]):
 for elm1 in lst:
  for elm2 in lst:
   if elm2 is in range of elm1:
    process(elm1,elm2)

进程函数只是将elm2作为邻居或elm1作为mongodb数据库。我的mongodb数据库中的每条记录的结构如下

记录'R'|记录'R'的邻居列表

1 个答案:

答案 0 :(得分:1)

您可以通过索引存储桶中的记录来加快实施速度。假设你的所有记录都在网格[0,100] x [0,100]中。创建99个x-buckets [0,1),[1,2],... [99,100]和99 y-buckets。对于给定记录[x1,y1]和距离d,取x-buckets [x1-d-1]与[x1 + d + 1]的交点,将y-buckets [y1-d-1]与[ y1 + d + 1],然后测试[x1,y1]的欧氏距离与结果集中的点之间的距离。