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

标签 python hadoop hive

我正在尝试对地理 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_numberend_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)

非常感谢任何帮助!

最佳答案

我可以看到两种方法。

  1. 创建一个 UDF,它将使用 Distributed Cache 加载 geo-ip 数据并用它来丰富使用表
  2. 创建一个 UDF,将 geo-ip 扩展为完整的 32 位 ip 地址,以便您可以进行标准连接

这些都不是那么好。选项 1 的执行速度会快得多,因为它将能够通过使用表上的单个 map 传递来输出结果。这样做的缺点是加载 2.9MM 行的 geo-ip 数据需要内存。

关于python - 使用 sum(if...) 或条件语句操作两个数据集,这些语句与 Hive Hadoop Python 没有共同的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8694783/

相关文章:

python - 属性错误: '<Class name>' object has no attribute 'request'

python - 建议向单元格批量添加值的正确方法取决于其他单元格

hadoop mapred 作业 - 初始化尝试 mapred 任务时出错

hadoop - 基于Hadoop的自动化

java - 由于 isValid() 操作无效,JDBC 到 hive 的连接失败

python - 删除行包含 Pandas 数据框中的非英语单词

apache - Hbase Master 和 Region 服务器无法启动

apache-spark - 如何在没有 hive-site.xml 的情况下将 Spark SQL 连接到远程 Hive Metastore(通过节俭协议(protocol))?

azure - Hive 表和 databricks 增量表之间的时间戳数据值不同

python - 拉上交替元素