hiveip地理编码(交叉连接半大表)

hec6srdp  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(331)

我的问题。
我有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连接吗?
提前谢谢。

lsmd5eda

lsmd5eda1#

我去年有你的问题。
由于我的地理编码表安装在ram中,所以我做了以下工作:
我已经编写了java类(我们称之为 GeoCoder )将光盘中的地理编码信息读取到ram中,并在内存中进行地理编码。
我已添加文件 geocode.info 到分布式缓存(hive add file 命令执行此操作)。
我已经写好了 UDF 已创建(或已创建时使用) GeoCoder 中的示例 evaluate 方法。Hive UDF 可以通过获取分布式缓存中文件的本地路径 getClass().getClassLoader().getResource("geocode.info").getFile() 现在我有了 geocode.info (现在它是一个普通的文件)其余的都是历史。
也许这个方法是一种过度使用(java的150行代码),但它对我来说是有效的。
我还假设您真的需要使用hadoop(就像我做的那样)来完成任务。500000 IP的地理编码可能可以在笔记本电脑上很快完成。

相关问题