我的问题。
我需要500000个不同的IP地址来进行地理编码。地理代码查找表有一个ip-从和ip到范围,我必须与之进行比较,一个180万行的表。
所以基本上是:
select *
/*+ MAPJOIN(a) */
from ip_address a
cross join ip_lookup b
where a.AddressInt >= b.ip_from and a.AddressInt <= b.ip_to;在aws EMR上,我运行了一个10 m1大的集群,在交叉连接阶段,它在20分钟内停留在0%,但有趣的是:
Stage-5: number of mappers: 1; number of reducers: 0问题: 1)有人有比交叉连接更好的想法吗?我不介意引发更多的实例,但我怀疑这会有帮助,2)我是否真的在内存中存储ip_addresses时做了一个交叉映射连接?
提前谢谢。
发布于 2014-01-23 11:34:32
去年我遇到了你的问题。
由于我的地理代码表安装在RAM中,下面是我所做的:
GeoCoder),它将磁盘中的地理代码信息读入内存中,并在内存中进行地理编码。geocode.info添加到分布式缓存中(Hive add file命令就是这样做的)。UDF,它在evaluate方法中创建(或者如果已经创建) GeoCoder实例。UDF可以通过getClass().getClassLoader().getResource("geocode.info").getFile()在分布式缓存中获取文件的本地路径。geocode.info的本地路径(现在它是一个普通文件),其余的都是历史。这个方法可能有点过分(150行Java),但对我来说很管用。
此外,我假设您确实需要在任务中使用Hadoop (就像我所做的那样)。500000个IP的地理编码可能很快就能在笔记本上完成。
https://stackoverflow.com/questions/21297229
复制相似问题