我正在使用此配置单元查询来发现所有帐户的国家/地区代码。问题是连接将数据集爆炸到无法管理的大小,有时甚至作业无法完成。
完成此 geoip 查找查询的快速有效方法是什么?不强制使用 Hive
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
Hive 不支持 ON
子句中的 BETWEEN
。此外,WHERE
过滤器仅在连接完成后应用。任何提示也会很有用。我目前正在尝试使用自定义 MapReduce 作业来解决这个问题。有人有什么想法吗?
信息
geoip
表大小约为 1MB- Hadoop 集群只有 12 个 map 槽和 12 个 reduce 槽
- 我尝试根据
begin_ip_num
第一个八位字节(例如:123.0.0.0
的123
)对 geoip 表进行存储,并且然后在JOIN
子句中使用条件,例如FROM data JOIN geoip ON (data.first_octet_bucket=geoip.first_octet_bucket)
。此技术不起作用,因为某些行将被遗漏。
最佳答案
最终选择的方案是绕过Hive。我们将 geoip 表序列化为常规 java TreeMap,并使用 Hadoop 的 DistributedCache 将其上传到自定义映射器。
关于sql - HiveQL - 大数据的高效 geoip 发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15093800/