sql - HiveQL - 大数据的高效 geoip 发现

标签 sql hadoop mapreduce hive hiveql

我正在使用此配置单元查询来发现所有帐户的国家/地区代码。问题是连接将数据集爆炸到无法管理的大小,有时甚至作业无法完成。

完成此 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.0123)对 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/

相关文章:

hadoop - sqoop支持通过 hive 进行动态分区吗?

java - 级联groupby示例

java - Hadoop - 每个节点的字数

mysql - 分组依据 - 需要单行显示

java - Derby - java.sql.SQLException : Column 'table.column_name' not found

mysql命令-如果字符长度则更新

sql - PL/Sql过程vs函数?

hadoop - 用于将数据加载到 Hadoop 中的 FastExport 脚本?

java - 使用 Python 读取 AVRO 文件

hadoop - 无法执行Map/Reduce作业