我的问题。
我有500000个不同的ip地址需要进行地理编码。geocode查找表有一个ip-from和ip-to范围,我必须与之进行比较,一个包含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.large的集群,在交叉连接阶段,它会停留在0%,持续20分钟,但有趣的是:
Stage-5: number of mappers: 1; number of reducers: 0
问题:1)有人有比交叉连接更好的想法吗?我不介意再启动几个(十几个)示例,但我怀疑这会有帮助,2)我真的在内存中存储ip地址时做了交叉Map连接吗?
提前谢谢。
1条答案
按热度按时间lsmd5eda1#
我去年有你的问题。
由于我的地理编码表安装在ram中,所以我做了以下工作:
我已经编写了java类(我们称之为
GeoCoder
)将光盘中的地理编码信息读取到ram中,并在内存中进行地理编码。我已添加文件
geocode.info
到分布式缓存(hiveadd file
命令执行此操作)。我已经写好了
UDF
已创建(或已创建时使用)GeoCoder
中的示例evaluate
方法。HiveUDF
可以通过获取分布式缓存中文件的本地路径getClass().getClassLoader().getResource("geocode.info").getFile()
现在我有了geocode.info
(现在它是一个普通的文件)其余的都是历史。也许这个方法是一种过度使用(java的150行代码),但它对我来说是有效的。
我还假设您真的需要使用hadoop(就像我做的那样)来完成任务。500000 IP的地理编码可能可以在笔记本电脑上很快完成。