我有两个篮子,
- df_A的大小为几兆字节,主键P
- df_B的大小为几千兆字节,也有该行P
如何有效地从df_A中删除所有P存在于df_B中的记录?
目前我使用朴素的spark sql语法来完成这一点,没有任何优化
df_A.createOrReplaceTempView('df_A_table')
df_B.createOrReplaceTempView('df_B_table')
spark.sql("""
select
*
from df_A_table
where df_A_table.P not in (
select P from df_B_table
)
""")
字符串
广播连接在这里有意义吗?如果有,它在这里有什么帮助(我只是猜测它可能工作,但不确定)
1条答案
按热度按时间lc8prwob1#
从
df_A
中删除P
存在于df_B
中的所有记录可以通过在df_A和df_B之间执行left anti-join
来完成。下面是一个例子,其中表A和B可以在P上保持反连接:
字符串
通常对于连接(或反连接),pyspark将需要对两个表的数据进行 Shuffle ,并将两个表中具有匹配P值的部分放入相同的节点中。但是, Shuffle 一个大表是昂贵的,因此广播连接将较大的表拆分到不同的节点中。(而不将其混洗),并且整个较小的表被“广播”或复制到每个节点,以与较大表的每个片段连接。
在你的例子中,由于df_B比df_A大得多,我们广播较小的框架将其发送到所有节点,以与较大的框架(在所有节点之间拆分)连接:
型
测试结果:
型