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 地理编码(交叉连接半大表)的主要内容,如果未能解决你的问题,请参考以下文章