我正在尝试对地理 ip 定位的准确性进行分析,并且有两个非常大的数据集可以根据 ip 地址到 ip 整数或 ip_number
(s) 的转换来处理。
转换过程如下
ip_number = 16777216*w + 65536*x + 256*y + z (1)
在哪里
IP Address = w.x.y.z
我使用 Hive 在 Hadoop 中构建了我的两个表:表 1 是 2.9MM 行,并组织到由 ip_number
(s) 范围标识的地理位置。字段读出:
start_ip, end_ip, zipcode, city
start_ip
是给定邮政编码的最小 ip_number
,end_ip
是最大 ip_number
。
此表是 ip_num 桶或范围的索引以及我需要从具有唯一 ip_number(s) 的另一个表分析其使用情况的相应位置。
我的第二个表或数据集包括来 self 们服务器的每个单独 IP 的交互和使用数据。因此,我有 25MM 唯一 ip_number
(s),其中包含我需要在第一个表中按存储桶汇总和分组的使用数据。字段读出:
ip_number, ip_address, usage
在 hive 中标准连接的两个数据集之间没有公共(public)字段,所以我被卡住了。
我尝试过使用完全外部联接,但认为生成的数据集太大,我们的 Hadoop 集群无法处理。脚本在 map/reduce 期间超时。
Hive 有没有一种方法可以从我的第一个表中选择行,并从我的第二个表中为来自 ip_numbers 的事件对第一个表中每个桶或范围内的事件求和?如果没有,是否可以使用 Python 或 R 来操纵 Hadoop 表来完成此操作?
我想要组织生成的数据集:
table_1.ip_start, table_1.ip_end, table_1.zipcode, sum(table_2.usage)
非常感谢任何帮助!
最佳答案
我可以看到两种方法。
- 创建一个 UDF,它将使用 Distributed Cache 加载 geo-ip 数据并用它来丰富使用表
- 创建一个 UDF,将 geo-ip 扩展为完整的 32 位 ip 地址,以便您可以进行标准连接
这些都不是那么好。选项 1 的执行速度会快得多,因为它将能够通过使用表上的单个 map 传递来输出结果。这样做的缺点是加载 2.9MM 行的 geo-ip 数据需要内存。
关于python - 使用 sum(if...) 或条件语句操作两个数据集,这些语句与 Hive Hadoop Python 没有共同的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8694783/