pyspark中的动态布尔连接
我有两个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
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操作