如何使用循环创建连接条件?



我正在创建一个通用条件,用于连接具有相同键和相同结构的2个数据框,如下面的代码。我想把它作为一个函数来比较2个数据帧。第一个想法,我将其作为字符串条件,因为它很容易将条件与循环连接起来。最后,连接条件似乎不能接受字符串条件。有人能指点我一下吗?

import pyspark.sql.functions as F
key = "col1 col2 col3"
def CompareData(df1,df2,key) :
key_list = key.split(" ")
key_con=""
for col in key_list:
condi = "(F.col("" + col +"") == F.col(""+"x_"+col+""))"  # trying to generate generic condition
key_con=key_con + "&" + condi
key_condition=key_con.replace('&','',1)
df1_tmp = df1.select([F.col(c).alias("x_"+c) for c in df1.columns])
df_compare = df2.join(df1_tmp, key_condition , "left")  # The problem was here. key_condition has error. If I copy the condition string below and place into join condition, it works fine.
# key_condition = (F.col("col1") == F.col("x_col1")) & (F.col("col2") == F.col("x_col2")) & (F.col("col3") == F.col("x_col3")) 

试试这个:

key_con = F.lit(True)
for col in key_list:
condi = (F.col(col) == F.col(f"x_{col}"))
key_con = key_con & condi
在您的尝试中,您的条件类型为字符串。但是join的参数on只接受字符串,如果它是一个普通的列名。您正在尝试创建列表达式并将其传递给on参数。列表达式与字符串是不同的,所以您需要一个稍微不同的方法来生成复合列表达式。

最新更新