pyspark中的动态布尔连接

pyspark中的动态布尔连接,pyspark,Pyspark,我有两个pyspark数据帧,模式如下- df_update = df_source.join(df_target, (df_source["id"] == df_target["id"]) & ((df_source["name"] != df_target["name"]) | (df_source["age"] != df_target["age"])) ,how="inner").select([df_source[col] for col in df_source.colum

我有两个pyspark数据帧,模式如下-

df_update = df_source.join(df_target, (df_source["id"] == df_target["id"]) & ((df_source["name"] != df_target["name"]) | (df_source["age"] != df_target["age"]))  ,how="inner").select([df_source[col] for col in df_source.columns])
df_来源:

id, name, age
df_目标:

id,name,age
“id”是表中的主列,其余都是属性列

我接受用户提供的主列和属性列列表,如下所示-

primary_columns = ["id"]
attribute_columns = ["name","age"]
我需要动态连接以上两个数据帧,如下所示-

df_update = df_source.join(df_target, (df_source["id"] == df_target["id"]) & ((df_source["name"] != df_target["name"]) | (df_source["age"] != df_target["age"]))  ,how="inner").select([df_source[col] for col in df_source.columns])

既然属性列和主键列的数量可以根据用户的输入而改变,那么如何在pyspark中动态实现这种连接条件呢?请提供帮助。

IIUC,您只需在
主列上使用一个内部联接和一个在
属性列上循环的
where
子句,即可获得所需的输出

由于两个数据帧具有相同的列名,因此使用来区分
连接后的列名

from functools import reduce
from pyspark.sql.functions import col

df_update = df_source.alias("s")\
    .join(df_target.alias("t"), on=primary_columns, how="inner")\
    .where(
         reduce(
             lambda a, b: a|b, 
             [(col("s."+c) != col("t."+c) for c in attribute_columns]
         )\
    )
    .select("s.*")
使用reduce对
属性_columns
中的列应用按位OR操作