Python 如何在PySpark中以最佳方式连接两个具有两个条件的表

Python 如何在PySpark中以最佳方式连接两个具有两个条件的表,python,pyspark,pyspark-sql,Python,Pyspark,Pyspark Sql,我在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

我在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.*)

由于这两个条件,表的大小使得这个选项不是最优的,我曾想过对表B进行排序,以便它只包含一个连接条件

有没有办法限制联接并只获取与联接条件匹配的第一条记录?或者以某种方式以最佳方式进行连接


表A(记录数)为什么标记?你在寻找SQL答案吗?你有任何线索@Steven吗?在我看来,你想要的输出不正确,因为IP
10.11.25.60
不在
10.10.11.0/24
中。也就是说,出于效率考虑,您通常会尝试将较小的表加入较大的表中,这样您就不需要洗牌较大的表。如果您确定CIDR表覆盖了所有IP,那么在使用过滤器之后的
join=“left”
可能会快得多(或者甚至是how=“inner”,但正如我所说,只有在CIDR表覆盖了您想要的所有IP时)。还有一个选项:如果您知道计算字段
net\u ip\u first
net\u ip\u last
的公式,就使用它吧?

| 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 | ...