[英]How to create a join condition using a loop?
我正在创建一个通用条件来连接 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
在您的尝试中,您的条件是string类型。 但是join
的参数on
只接受字符串,如果它是一个普通的列名。 您正在尝试创建一个列表达式并将其传递给on
参数。 列表达式与字符串不同,因此您需要一种稍微不同的方法来制作复合列表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.