首页 > 解决方案 > 如何以最佳方式在 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(记录数)

谢谢!

标签: pythonpysparkpyspark-sql

解决方案


推荐阅读