使用Hive Hadoop Python操作两个没有共同标识符的数据集,使用sum(if...)或条件语句

2 投票
1 回答
731 浏览
提问于 2025-04-17 09:21

我正在进行一个关于地理IP定位准确性的分析,手头有两个非常大的数据集,这些数据集是通过将IP地址转换为IP整数或ip_number来获得的。

转换的过程如下:

ip_number = 16777216*w + 65536*x + 256*y + z   (1)

其中

IP Address = w.x.y.z

我在Hadoop中用Hive创建了两个表:第一个表有290万行,按照ip_number的范围来组织地理位置。字段内容如下:

start_ip, end_ip, zipcode, city 

这里的start_ip是某个邮政编码的最小ip_number,而end_ip是最大ip_number

这个表是一个ip_num的范围索引,记录了对应的地理位置,我需要从另一个表中分析这些位置的使用情况,这个表包含了独特的ip_number

我的第二个表或数据集包含了来自我们服务器的每个IP的互动和使用数据。所以我有2500万独特的ip_number,需要将这些使用数据按第一个表中的范围进行汇总和分组。字段内容如下:

ip_number, ip_address, usage

这两个数据集之间没有共同的字段,无法在Hive中进行标准的连接,所以我遇到了困难。

我尝试过使用全外连接,但我认为生成的数据集太大,无法让我们的Hadoop集群处理。在进行map/reduce时,脚本超时了。

有没有办法在Hive中选择第一个表的行,并对第二个表中符合第一个表每个范围的ip_number的活动进行汇总?如果没有,是否可以使用Python或R来处理Hadoop表以实现这个目标?

我希望得到的结果数据集是这样的:

table_1.ip_start, table_1.ip_end, table_1.zipcode, sum(table_2.usage)

非常感谢任何帮助!

1 个回答

0

我看到有两种方法可以解决这个问题。

  1. 创建一个用户定义的函数(UDF),通过分布式缓存来加载地理IP数据,然后用这些数据来丰富使用表。
  2. 创建一个用户定义的函数(UDF),将地理IP扩展为完整的32位IP地址,这样你就可以进行标准的连接操作。

这两种方法都不是特别理想。第一种方法的速度会快很多,因为它可以通过一次遍历使用表来输出结果。不过,这种方法的缺点是需要加载290万行的地理IP数据,这会占用很多内存。

撰写回答