我正在使用此配置单元查询来发现所有帐户的国家/地区代码。问题是连接将数据集扩展到无法管理的大小,甚至有时作业也无法完成。
什么是一种快速有效的方法来完成这个geoip查找查询?不强制使用配置单元
SELECT /*+ MAPJOIN(geoip) */
data.account_id, geoip.country_code
FROM data JOIN geoip
WHERE data.ip_num BETWEEN geoip.begin_ip_num AND geoip.end_ip_num
配置单元不支持 BETWEEN
内部 ON
条款。此外,还有 WHERE
筛选器仅在联接完成后应用。任何提示都是有用的。我目前正试图解决这个使用自定义mapreduce作业。有人有什么想法吗?
信息 geoip
表的大小约为1mb
hadoop集群只有12个map槽和12个reduce槽
我试着根据 begin_ip_num
第一个八位字节(例如 123
的 123.0.0.0
),然后使用 JOIN
从句式 FROM data JOIN geoip ON (data.first_octet_bucket=geoip.first_octet_bucket)
. 此技术不起作用,因为某些行将被忽略。
4条答案
按热度按时间5jdjgkvh1#
尝试下推。
打开文件:
添加:
参考:predicatepushdown.html
r6hnlfcb2#
最终选择的解决方案是绕过Hive。我们将geoip表序列化为一个常规的javatreemap,并使用hadoop的distributedcache将其上传到自定义Map器。
q3qa4bjr3#
从数据d outer apply中选择d.account\ id、d.a、d.b、d.c、i.country\ U code(从geoip g中选择top 1,其中d.ip\ num介于g.begin\ U ip\ num和g.end\ U ip\ num之间)
敬礼
5us2dqdw4#
我想现在这不是简单的解决办法。无非等连接支持s#c#s。这里有一些解决办法https://reviews.facebook.net/d4137 . 顺便说一句,祝你好运。