上一篇,我使用了Python实现了网格索引的编写,因为后续工作的需要,现在使用mapreduce并行构建网格索引,全球坐标按照0.2*0.1的粒度进行划分,并把构建好的索引和对应的空间对象写入到hdfs中。
问题背景:和上一篇博客一样。
解决方法:
GeoObj对象:抽象出空间实体对象,拥有 名称、x坐标、y坐标三个属性。
map函数: 读取数据文件,判断文件的每行对象的Index,并把Index和对象名称或者对象通过context传送给reduce函数。
reduce函数:汇总map函数传递过来的数据,将相同Index的对象,合并到一起,并写入到hdfs文件。
测试运行,结果文件如下
我们可以看到 对应的,网格索引和空间对象名称,这里我们也可以存放整个空间对象。
hadoop的优势在于处理大的数据文件,这里我就测试了一个比较大的文件 city2.txt 1.1Gb,从运行到结束共使用了874s,自我感觉还是挺慢的。
思路清晰了,实现的代码也比较简单,这里就不贴了。