合并两个数据帧并从正确的数据帧中检索所有信息

Merge two data frames and retrieve all the information from the right data frame

嗨 Stack Overflow 社区。我是 spark/pyspark 的新手,我有这个问题。

假设我有两个数据框(df2 是包含大量记录的兴趣数据集,df1 是新的更新)。我想在多个列上加入两个数据框(如果可能的话),并在存在键匹配时从 df1 获取更新信息,否则保持 df2 信息不变。

这是我的示例数据集和我的预期输出 (df30)

df1 = spark.createDataFrame([("a", 4, 'x'), ("b",  3, 'y'), ("c", 4, 'z'), ("d", 4, 'l')], ["C1", "C2", "C3"])
df2 = spark.createDataFrame([("a", 4, 5), ("f", 3, 4), ("b", 3, 6), ("c", 4, 7), ("d", 4, 8)], ["C1", "C2","C3"])
df1_s = df1.select([col(c).alias('s_' + c) for c in df1.columns])

您可以在您的列列表上使用左连接,并使用列表推导式对其余列进行 select 使用 coalesce 函数进行更新:

from pyspark.sql import functions as F

join_columns = ["C1"]

result = df2.alias("df2").join(
    df1.alias("df1"),
    join_columns,
    "left"
).select(
    *join_columns,
    *[
        F.coalesce(f"df1.{c}", f"df2.{c}").alias(c)
        for c in df1.columns if c not in join_columns
    ]
)

result.show()
#+---+---+---+
#| C1| C2| C3|
#+---+---+---+
#|  f|  3|  4|
#|  d|  4|  l|
#|  c|  4|  z|
#|  b|  3|  y|
#|  a|  4|  x|
#+---+---+---+