从小数据框中删除存在于 pyspark/spark 中较大数据框中的键

问题描述 投票:0回答:1

我有 2 个数据框,

  1. df_A 的大小为几兆字节,主键 P
  2. df_B 的大小为几 GB,也有这一行 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
)
""")

广播加入在这里有意义吗?如果是的话,它在这里有什么帮助(我只是猜测它可能有效,但不确定)

apache-spark join pyspark query-optimization
1个回答
0
投票

如果我正确理解你的问题,从 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|
+---+---+
© www.soinside.com 2019 - 2024. All rights reserved.