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

Posted

技术标签:

【中文标题】hive ip 地理编码(交叉连接半大表)【英文标题】:hive ip geocoding (cross join semi-big tables) 【发布时间】:2014-01-23 00:49:58 【问题描述】:

我的问题。

我有 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 那样进行交叉映射连接吗?

提前致谢。

【问题讨论】:

【参考方案1】:

去年我遇到了你的(某种)问题。

由于我的地理编码表适合 RAM,这就是我所做的:

    我编写了 Java 类(我们称之为GeoCoder),它可以将地理编码信息从光盘读取到 RAM 中并 在内存中进行地理编码。 我已将文件 geocode.info 添加到分布式缓存中(Hive add file 命令执行此操作)。 我在evaluate 方法中编写了UDF,它创建了(或者如果它已经创建,则使用)GeoCoder 实例。 HiveUDF可以通过getClass().getClassLoader().getResource("geocode.info").getFile()获取分布式缓存中文件的本地路径 现在我有了geocode.info的本地路径(现在是普通文件),剩下的就是历史了。

这种方法可能有点过头了(150 行 Java 代码),但它对我有用。

我还假设您确实需要使用 Hadoop(就像我一样)来完成您的任务。 500000 个 IP 的地理编码可能很快就可以在笔记本电脑上完成。

【讨论】:

以上是关于hive ip 地理编码(交叉连接半大表)的主要内容,如果未能解决你的问题,请参考以下文章

3G/Edge/GPRS IP 地址和地理编码

在 python 和/或 django 中按 IP 进行地理编码

MongoDB - 地理空间交叉点性能

用于从 IP 地址获取地理编码的 Java 库

OSMNX 地理编码器返回不正确的坐标

基于地理编码的 IP 居中 Google 地图