pyspark 加入多个条件并删除两个重复的列

pyspark join multiple conditon and drop both duplicate column

我是 pandas 的 pyspark 新手。

在一个条件下加入并删除副本似乎在我这样做时完美地工作:

df1.join(df2, df1.col1 == df2.col1, how="left").drop(df2.col1) 

但是,如果我想加入两列条件并删除两列加入的 df b.c 怎么办?它是重复的。

我试过:

df1.join(df2, [df1.col1 == df2.col1, df1.col2 == df2.col2, how="left").drop(df2.col1, df2.col2)

方法drop 只能使用单个Column 表达式或one/more 字符串列名来删除。这就是为什么它适用于 drop(df2.col1) 但在使用 drop(df2.col1, df2.col2).

时引发异常

以这两个数据帧为例:

df1 = spark.createDataFrame([(1, 1), (2, 2)], ["col1", "col2"])
df2 = spark.createDataFrame([(5, 3, "ok"), (2, 2, "ko")], ["col1", "col2", "status"])

您可以像这样删除重复的列:

  1. 使用列名列表作为连接条件
df1.join(df2, ["col1", "col2"], "left").show()

#+----+----+------+
#|col1|col2|status|
#+----+----+------+
#|   1|   1|  null|
#|   2|   2|    ko|
#+----+----+------+
  1. 使用select表达式
df1.join(df2, (df1["col1"] == df2["col1"]) & (df1["col2"] == df2["col2"]), "left")\
    .select(
        df1["*"],
        *[df2[c] for c in df2.columns if c not in ["col1", "col2"]]
    ).show()

#+----+----+------+
#|col1|col2|status|
#+----+----+------+
#|   1|   1|  null|
#|   2|   2|    ko|
#+----+----+------+