我有 2 个数据框,
如何有效地从 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
)
""")
广播加入在这里有意义吗?如果是的话,它在这里有什么帮助(我只是猜测它可能有效,但不确定)
如果我正确理解你的问题,从 df_A 中删除 P 不存在于 df_B 中的所有记录与在 df_A 中保留所有记录相同,只要 P 与 df_B 匹配,这可以通过在 P 上内连接 df_A 和 df_B 来完成。
为了利用广播连接,由于 df_B 比 df_A 大得多,因此我们广播较小的数据帧。下面是一个例子:
df_A:
+---+---+
| P| Q|
+---+---+
| 1| 10|
| 2| 20|
| 3| 30|
| 4| 40|
+---+---+
df_B:
+---+---+
| P| Q|
+---+---+
| 1| 10|
| 2| 20|
| 3| 30|
| 4| 40|
+---+---+
df_A.join(
F.broadcast(df_B),
df_A.P == df_B.P
).select(
df_A.P, df_A.Q
)
结果:
+---+---+
| P| Q|
+---+---+
| 1| 10|
| 3| 30|
+---+---+