Apache spark 如何根据另一个数据帧填充空值

Apache spark 如何根据另一个数据帧填充空值,apache-spark,pyspark,Apache Spark,Pyspark,我目前开始使用pyspark。我有一个两列数据框,其中一列包含一些空值,例如 df1 A B 1a3b 7 0d4s 12 6w2r null 6w2r null 1p4e null 另一个数据帧具有正确的映射,即 df2 A B 1a3b 7 0d4s 12 6w2r 0 1p4e 3

我目前开始使用pyspark。我有一个两列数据框,其中一列包含一些空值,例如

df1
A             B
1a3b          7
0d4s          12
6w2r          null
6w2r          null
1p4e          null
另一个数据帧具有正确的映射,即

df2
A             B
1a3b          7
0d4s          12
6w2r          0
1p4e          3
因此,我想使用
df2
s.t来填充
df1
中的空值。结果是:

A             B
1a3b          7
0d4s          12
6w2r          0
6w2r          0
1p4e          3
在pandas中,我首先从
df2
创建一个查找字典,然后在
df1
上使用apply填充空值。但是我不确定在pyspark中使用什么函数,我看到的大多数替换空值都是基于简单的条件,例如,将所有空值填充为特定列的单个常量值

我尝试的是:

from pyspark.sql.functions import when, col

df1.withColumn('B', when(df.B.isNull(), df2.where(df2.B== df1.B).select('A')))
虽然我得到的是
AttributeError:'DataFrame'对象没有属性'\u get\u object\u id'
。逻辑是首先过滤掉空值,然后用df2中B列的值替换它,但我认为
df.B.isNull()
计算整个列,而不是单个值,这可能不是正确的方法,有什么建议吗?

在公共列A上左键连接,并选择适当的列可以获得所需的输出

df1.join(df2, df1.A == df2.A, 'left').select(df1.A, df2.B).show(truncate=False)
应该给你什么

+----+---+
|A   |B  |
+----+---+
|6w2r|0  |
|6w2r|0  |
|1a3b|7  |
|1p4e|3  |
|0d4s|12 |
+----+---+

它起作用了!但我仍然想知道如何通过检查条件直接填充空值,以及使用一种方法比另一种方法有什么优势?如果
df1
B
中的大多数值都不是空值,我想
join
是一种过度杀伤力?您可以将df1分成两个数据帧。一个为空,一个为非空。按照答案中的方法连接空值,然后最终将它们合并。这应该是高效和快速的