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

时间:2019-11-27 14:05:19

标签: 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 | 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(记录数)

谢谢!

0 个答案:

没有答案