我的问题。
我需要500,000个不同的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_addresses存储在内存中一样吗?
提前致谢。
答案 0 :(得分:1)
去年我遇到了你的(某种)问题。
由于我的地理编码表安装在RAM中,这就是我所做的:
GeoCoder
),它将光盘中的地理编码信息读入RAM并
在内存中进行了地理编码。geocode.info
添加到分布式缓存中(Hive add file
命令执行此操作。)UDF
GeoCoder
方法中创建(或使用,如果已经创建)evaluate
实例。 Hive UDF
可以通过getClass().getClassLoader().getResource("geocode.info").getFile()
geocode.info
的本地路径(现在它是普通文件),其余的是历史记录。这种方法可能是一种矫枉过正(150行Java),但它对我有用。
此外,我认为您确实需要使用Hadoop(就像我一样)来完成您的任务。 可以在笔记本电脑上快速地对500000个IP进行地理编码。