我正在创建一个通用条件,用于连接具有与下面代码相同的键和结构的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"))
发布于 2022-07-11 11:42:50
试试这个:
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
参数。列表达式与字符串不是一回事,所以您需要一种稍微不同的方法来生成一个复合列表达式。
https://stackoverflow.com/questions/72937901
复制相似问题