python - 如何以最佳方式在 PySpark 中以两个条件连接两个表
问题描述
我在 PySpark 中有以下两个表:
表 A - dfA
| ip_4 | ip |
|---------------|--------------|
| 10.10.10.25 | 168430105 |
| 10.11.25.60 | 168499516 |
和表 B - dfB
| net_cidr | net_ip_first_4 | net_ip_last_4 | net_ip_first | net_ip_last |
|---------------|----------------|----------------|--------------|-------------|
| 10.10.10.0/24 | 10.10.10.0 | 10.10.10.255 | 168430080 | 168430335 |
| 10.10.11.0/24 | 10.10.11.0 | 10.10.11.255 | 168430336 | 168430591 |
| 10.11.0.0/16 | 10.11.0.0 | 10.11.255.255 | 168493056 | 168558591 |
我使用以下命令在 PySpark 中加入了两个表:
dfJoined = dfB.alias('b').join(F.broadcast(dfA).alias('a'),
(F.col('a.ip') >= F.col('b.net_ip_first'))&
(F.col('a.ip') <= F.col('b.net_ip_last')),
how='right').select('a.*, b.*)
所以我得到:
| ip | net_cidr | net_ip_first_4 | net_ip_last_4| ...
|---------------|---------------|----------------|--------------| ...
| 10.10.10.25 | 10.10.10.0/24 | 10.10.10.0 | 10.10.10.255 | ...
| 10.11.25.60 | 10.10.11.0/24 | 10.10.11.0 | 10.10.11.255 | ...
由于有 2 个条件,表的大小使该选项不是最优的,我曾想过对表 B 进行排序,以便它只暗示一个连接条件。
有什么方法可以限制连接,只取与连接条件匹配的第一条记录吗?或者以某种方式以最佳方式进行连接?
表 A(记录数)<< 表 B(记录数)
谢谢!
解决方案
推荐阅读
- javascript - 是否有在二维数组中查找索引值的最佳方法
- python - Raspberry Pi 中 python 回调函数的限制
- c - 显示内部与外部链接的示例
- python - 与 Django 中的模型属性相比,从包含不同键的 dict 创建模型实例
- javascript - 使用“crypto”创建的函数不会返回我用它创建的 BearerToken
- html - 如何使用 src 属性链接 HTML 代码?
- java - 一个通用类,让我有不同的返回类型(Java)
- amazon-web-services - 如何为 AWS AppSync API 创建 staging/dev/prod 环境
- security - 密码中的一个字符有多少位?
- c - 静态函数已声明但从未引用错误